2012-11-08 64 views
0

這是我的模式:的preg_match劈裂兩個一個字,最後一個字符返回作爲拍攝組

$fullname = '/^([a-zA-Z]+)(?:[,]?[\s]?)?([a-zA-Z]+)((?:\s)([a-zA-Z]{1}))?$/i'; 

,我使用它在PHP preg_match($nameReg, $value, $match)

我想捕獲姓氏,然後名字。由於我將使用ajax在我的sql語句中使用LIKE動態加載結果,因此我想從姓氏開始,而不是等待第一個名字。

問題是,當我只輸入姓氏(第一個單詞)時,我將姓氏的最後一個字符作爲捕獲組。

Array 
(
    [0] => SMITH 
    [1] => SMIT 
    [2] => H 
) 

我想獲得

Array 
(
    [0] => SMITH 
    [1] => SMITH 
) 

,但我不明白是怎麼回事。

+1

你應該使用'/ x'修正,使您的正則表達式的可讀性。 – mario

回答

2

這是因爲在第二個[a-zA-Z]+中至少需要一個字母。如果您做出第二個捕獲組可選的它應該工作:

/^([a-zA-Z]+)(?:[,]?[\s]?)?([a-zA-Z]+)?((?:\s)([a-zA-Z]{1}))?$/i 

但是,您使用的是不區分大小寫的標誌,但仍然提供了兩個大寫和小寫變體。加上{1}總是多餘的。最後,單字符字符類也是不必要的,雖然它可能是一個趣味問題,但我認爲它們只是幫助需要逃避的空格和字符的可讀性。這可以縮短:

/^([a-z]+)(?:,?\s?)?([a-z]+)?((?:\s)([a-z]))?$/i 

也許這也是一個好主意,以嵌套你的一些可選組。例如,沒有任何理由讓第二個名字,如果沒有逗號或空格分隔它:

/^([a-z]+)(?:(?:,\s?|\s)([a-z]+)?)?(?:\s([a-z]))?$/i 
+0

你是男人。非常感謝。 – user1336449