2011-10-12 37 views
3

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

我试过用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),就应更换它们。

+2

'a-з'看起来有点奇怪。是西里尔文的“a”而不是常规的ascii'a'?如果是ascii,那么你在这里指定了一个heckuva范围的字符。 –

+0

其西里尔字母a。 –

回答

6

只要您的输入字符串是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为正则表达式。
+0

那么,对我来说这是行不通的。如果¸-з(西里尔字符)在$ data中,则返回值为NULL; –

+0

在我的浏览器中有三个字符(代码点)。你是指人物范围还是特定人物?你可以提供你遇到问题的人物的Unicode编号吗? – hakre

+0

嗯,没有你修改器的作品,很奇怪。 /[\ W] + /完美 –