这是我的模式:
$fullname = '/^([a-zA-Z]+)(?:[,]?[\s]?)?([a-zA-Z]+)((?:\s)([a-zA-Z]{1}))?$/i';
我在PHP中使用preg_match($nameReg, $value, $match)
。
我想捕获Lastname,然后是Firstname。由于我将使用ajax在我的sql语句中使用LIKE动态加载结果,因此我想从lastname开始而不是等待名字。
问题在于,当我只输入姓氏(第一个单词)时,我将姓氏的最后一个字符作为捕获的组。
Array
(
[0] => SMITH
[1] => SMIT
[2] => H
)
我想得到
Array
(
[0] => SMITH
[1] => SMITH
)
但我不明白这里发生了什么。
答案 0 :(得分: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