2011-10-12 105 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] + /完美 –