如果某些值位于字符串中的某些位置,则REGEX无法正确捕获某些名称

时间:2011-08-01 01:14:16

标签: php regex

我有以下正则表达式来测试有效的名称格式:

^[a-zA-Z]+(([\'\,\.\- ][a-zA-Z ])?[a-zA-Z]*)*$

似乎可以正常使用所有预期的奇数名称,包括以下内容:

o'Bannon
Smith, Jr.
Double-barreled

当我将它插入我的PHP代码时,我遇到了问题。如果第一个字符是一个它通过的数字有效。

如果最后一个字符是空格,逗号,句号或其他特殊字符,则表示无效。

我的PHP代码是:

$v = 'Tested Value';
$value = (filter_var($v, FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=>"^[a-zA-Z]+(([\'\,\.\-,\  ][a-zA-Z ])?[a-zA-Z]*)*$^"))));
if (strlen($value) <2 && strlen($v) !=0) {
    return "not valid";
}

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

^[a-zA-Z]+(([\'\,\.\-,\  ][a-zA-Z ])?[a-zA-Z]*)*$^

正则表达式开头和结尾处的插入符号(^)被解释为正则表达式分词符,而不是锚点。正则表达式并不真正匹配字符串开头的数字,它正在跳过它们,因此它可以在它找到的第一个字母处开始匹配。您几乎可以使用任何ASCII标点符号作为正则表达式转义符,但大多数人使用#~,这些都是相对不常见且在正则表达式中没有特殊含义。

至于最后不允许使用标点符号,这就是正则表达式的编写方式。具体来说,[\'\,\.\- ][a-zA-Z ]要求每个撇号,逗号,句点或连字符后跟一个字母或空格。如果你真的想在最后允许任何这些角色,那很简单:

~^(?:[a-z]+[',. -]*)+$~i

当然,这对于验证名称并不是一个特别好的正则表达式,但我没有更好的提供;这是一个正则表达特别不适合的工作。你真的想成为告诉你的用户他们自己的名字无效的人吗?

答案 1 :(得分:0)

你的正则表达式是复杂的

/^[a-z]+[',. a-z-]*$/i 

应该做同样的事情