2011-07-22 33 views
1

不工作,這是我目前的正則表達式的代碼來驗證英語&號:希伯來文正則表達式匹配在PHP

const CANONICAL_FMT = '[0-9a-z]{1,64}'; 

public static function isCanonical($str) 
{ 
    return preg_match('/^(?:' . self::CANONICAL_FMT . ')$/', $str); 

} 

漂亮的直線前進。現在我想改變它來驗證只有希伯來文,下劃線 和數字。所以我改變了代碼:

public static function isCanonical($str) 
{ 
    return preg_match('/^(?:[\u0590-\u05FF\uFB1D-\uFB40]+|[\w]+)$/i', $str); 

} 

但它不起作用。我基本上把維基百科的希伯來語UTF範圍。 什麼是錯在這裏?

回答

1

我能得到它的工作更容易,使用/u標誌和\p{Hebrew}Unicode character property

return preg_match('/^(?:\p{Hebrew}+|\w+)$/iu', $str); 

工作例如:http://ideone.com/gSlmh

+0

KObi,起點是什麼?:代表什麼? – Tom

+0

@Tom - 沒什麼特別的 - 它是[非捕獲組](http://stackoverflow.com/questions/3512471/non-capturing-group)。我只是從問題':)'中複製它 – Kobi

1

如果你想preg_match()用UTF-8的正常工作,您可能需要啓用u modifier(引用)

這個修飾符打開PCRE的附加功能是 用Perl不兼容。模式字符串被視爲UTF-8。


在你的情況,而不是使用正則表達式如下:

/^(?:[\u0590-\u05FF\uFB1D-\uFB40]+|[\w]+)$/i 

我想你會使用:

/^(?:[\u0590-\u05FF\uFB1D-\uFB40]+|[\w]+)$/iu 

(注意其它附加u末)

+0

感謝帕斯卡,但它沒有工作,其他任何建議? – Tom

+1

如果它不起作用,你能提供你正在使用的PHP和PCRE的版本嗎?這些信息在phpinfo()中,我問,因爲PCRE在較新的PHP版本中有了顯着的改進。 –

1

你需要th e/u修飾符來添加對UTF-8的支持。

如果它在一些其他代碼頁/字符集中,請確保您將希伯來語輸入轉換爲UTF-8。

+0

我試過了:$ str = utf8_encode($ str);然後:/ ^(?:[\ u0590- \ u05FF \ uFB1D- \ uFB40] + | [\ w] +)$/iu沒有任何運氣。 – Tom

+1

@Tom'utf8-encode()'編碼一個ISO-8859-1字符串,但這不是一個希伯來字符集。什麼是傳入的字符集?用適當的字符集嘗試'mb_convert_encoding()'。這些數據來自網頁嗎?因爲如果你在網頁上做了utf-8,你會讓你的生活變得更容易,那麼你就不需要轉換。另外,'\ u0590'在preg中是不合法的。你需要'\ x {0590}'。 – Ariel