2012-03-22 142 views
4

我想讓中文,日文(平假名,片假名,漢字),韓文,以及基本上任何unicode字母。我只想把第一個字符作爲字母只接受使用preg_match的UTF8字母

$pattern = '/\p{L}[\p{L}\p{N} _.-]+/u'; 
if(!preg_match($pattern, $subuser)){ 
    //Error 
} 

但是我的模式似乎接受前面帶有數字的字符串。當我補充說:

'/^\p{L}[\p{L}\p{N} _.-]+$/u' 

沒有字符串被接受。我曾嘗試使用\ p {Hiragana}等,但沒有真正的運氣。有人看到我做錯了嗎?

+0

您的測試字符串包含除字母,數字,ASCII空間,ASCII下劃線,ASCII期間和ASCII短劃線之外的任何內容嗎? – 2012-03-22 21:04:30

回答

2

這應該做的伎倆:

<?php 

$lines = array('12345', 'w123', 'hello'); 

$valid = array_filter($lines, function($line){ 
    return preg_match('/^\p{L}{1,}/iu', $line); 
}); 

var_dump($valid); 
+4

替代模式,也將工作:/^\ p {L} +/iu – 2012-03-22 21:03:07

+1

這隻會檢查第一個字符是否是一個字母,沒有更多。 (而'{1,'')是不雅的 - 這就是'+'量詞的用法,b)沒有用處,因爲只要至少有一個字母在一開始就匹配多少個字母無關緊要。所以你可以放棄它) – 2012-03-22 21:06:38

+0

@TimPietzcker同意;儘管我確實展示了+量詞作爲第一個註釋:) - >但是你是正確的,這不是必須的,但它顯示了一個更加明確的故事。去除量詞至多是微觀優化,最壞的情況是,對於已經在語法上掙扎的人來說,這是一種不必要的混淆。我會在這種情況下與可讀性:) – 2012-03-22 22:03:42

相關問題