【问题标题】:preg_replace with cyrillic charspreg_replace 用西里尔字符
【发布时间】:2011-12-06 07:27:47
【问题描述】:

我想用 null 替换这些字符 [^a-zа-з0-9_],但是当它是多字节字符串时我不能这样做。

我尝试使用 mb_*、iconv、PCRE、mb_eregi_replace 和 u 修饰符(用于 PCRE),但没有一个效果很好。

mb_eregi_replace 有效,但它只输出正确的 utf8 字符串,但当 preg_replace 使用相同的正则表达式时,它不会替换字符..

这是我的代码,适用于 unicode,但它不能替换文本。

function _data($data)
{
  mb_regex_encoding('UTF-8');
  return mb_eregi_replace('/[^a-zа-з0-9_]+/', '', $data);
}

var_dump(namespace\_data('Текст Removethis- and this _#$)( and also this $*@&$'));

结果是特殊字符 (#_$..) 当它应该替换它们时,如果我将函数更改为 preg_replace(并且没有 unicode)它应该替换它们。

【问题讨论】:

  • a-з 看起来有点奇怪。那是西里尔字母 a 而不是常规 ascii a?如果它是 ascii,则您在此处指定了一个 hekkuva 范围的字符。

标签: php replace multibyte


【解决方案1】:

只要您的输入字符串是 UTF-8 编码的 (test if not or re-encode it to UTF-8),如果您使用带有 u (PCRE_UTF8) modifier 的正确正则表达式(最后是小写 U ):

function _data($data)
{ 
  return preg_replace('/[^\w_]+/u', '', $data);
}

var_dump(namespace\_data('Текст Removethis- and this _#$)( and also this $*@&$'));

Demo

  • \w = 任何单词字符
  • u(然后结束)= 为正则表达式启用 UTF-8。

【讨论】:

  • 好吧,对我来说这行不通。如果 а-з(西里尔字符)在 $data 中,则返回 NULL;
  • 在我的浏览器中是三个字符(代码点)。您是指字符范围还是特定字符?你能给出你遇到问题的字符的 unicode 编号吗?
  • 嗯,没有 u 修饰符它可以工作,奇怪。 /[\W]+/ 是完美的
  • 确保在使用 u 修饰符时传递的字符串是 UTF-8 编码的。如果它没有工作,则表明您执行代码的系统上的 PCRE 库是区域设置感知的并且知道您的语言。但是,该代码不可移植。使用另一个语言环境(例如,在不同配置的系统上),它可能会失败。所以最好寻找一个 UTF-8 解决方案,因为它更稳定并且适用于任何 UTF-8 可用的地方,这在今天非常普遍。
  • 好吧,var_dump(mb_detect_encoding($data));返回 UTF-8
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2016-03-13
相关资源
最近更新 更多