我有以下正则表达式来测试有效的名称格式:
^[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";
}
我在这里做错了什么?
答案 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
应该做同样的事情