preg_replace与西里尔字符

时间:2011-10-12 16:45:03

标签: php replace multibyte

我想用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),它应该替换它们。

1 个答案:

答案 0 :(得分:10)

只要您的输入字符串是UTF-8编码(如果没有,将其重新编码为UTF-8),如果您使用正确的正则表达式,则可以安全地使用preg_replace

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

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

Demo

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