2011-03-24 130 views
5

我有一個XHTML表單,我要求人們輸入他們的全名。然後我用preg_match()使用這種模式匹配:/^[\p{L}\s]+$/preg_match和(非英文)拉丁字符?

在我的本地服務器上運行PHP 5.2.13(PCRE 7.9 2009-04-11)這工作正常。 在運行PHP 5.2.10(PCRE 7.3 2007-08-28)的主機上,當輸入的字符串包含丹麥拉丁字符ø(http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%F8&mode=char)時,它不匹配。

這是一個錯誤?有沒有解決辦法?

預先感謝您!

+1

你使用'/ u'修飾符嗎?否則,在PHP 4.3之前,UTF-8已經得到支持。 PCRE更改日誌表明7.x系列中存在多個錯誤。 – mario 2011-03-24 19:58:57

+0

你可以檢查['preg_last_error']的輸出(http://us.php.net/manual/en/function.preg-last-error.php)嗎? – Charles 2011-03-24 20:00:09

+0

@mario不,我不知道。我不知道我會如何使用它?如果我只是添加u修飾符,該模式甚至不匹配我的本地服務器。 – 2011-03-24 22:59:44

回答

8

因此,問題是推定的。您沒有使用/u修飾符。這意味着PCRE不會查找UTF-8字符。

在任何情況下,這是應該怎麼做:

var_dump(preg_match('/^[\p{L}\s]+$/u', "ø")); 

和作品對我的所有版本。其他人可能存在缺陷,但這不太可能。

你的問題是,這也適用:

var_dump(preg_match('/^[\p{L}\s]+$/', utf8_decode("ø"))); 

注意,這裏使用ISO-8859-1,而不是UTF-8的,並且留下了/u修改。結果是int(1)。顯然PCRE在非/u nicode模式下將Latin-1 ø解釋爲匹配\p{L}。 (大多數單字節\ xA0- \ xFF是Latin-1中的字母符號,而8位代碼點與Unicode中的相同,因此實際上可以。)

結論:您的輸入實際上是ISO-8859-1。這就是爲什麼它偶爾在沒有/u的情況下爲你工作。改變這一點,並與輸入字符集eaxact。

+1

非常感謝你的回答,馬里奧!我肯定在這裏學到了一些東西 - 首先是我對charsets太不一致了。 – 2011-03-26 20:15:07

+0

你當然沒有選擇最簡單的話題! :}字符集總是混亂。 PS:給我一個upvote或複選標記,如果它也有助於你的實際任務。 – mario 2011-03-26 20:17:43

+0

對不起 - 我在寫這個評論的過程中意外擊中了[enter]: u-modifier不起作用。 utf8_encode() - 技巧(不是_decode)適用於我的虛擬主機,但不是本地。 我真的想深究這一點,所以我希望你能爲我清除一些東西:我的MySQL表都有排序規則latin1_danish_ci,但是我的PHP腳本使用UTF8編碼,除了一個使用ISO Latin編碼的丹麥語言文件1。 我需要在哪裏清理東西?謝謝! – 2011-03-26 20:24:25