我是正则表达式的新手,我正在使用正则表达式进行一些表单验证。但问题是大多数正则表达式都像
^(?=.{8})(?=.*[A-Z])(?=.*[a-z])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%#a-zA-Z\d]+$
这是我用于密码验证的。对于其他表单验证,我在这里发现了很多这样的表达。现在问题是当我在我的代码中使用它们时如下
if(preg_match('^(?=.{8})(?=.*[A-Z])(?=.*[a-z])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%@#a-zA-Z\d]+$', $password))
我至少收到一个错误。大多数时候它显示错误无结束分隔符或未知修饰符等
答案 0 :(得分:2)
你的表情周围没有分隔符。
试试这个:
$pattern = '/^(?=.{8})(?=.*[A-Z])(?=.*[a-z])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%#a-zA-Z\d]+$/';
preg_match ($pattern, $password);
答案 1 :(得分:1)
直接回答:你的表达没有分隔符。 PCRE抓取第一个字符^
假定它是分隔符,并抛出错误,因为它在正则表达式的末尾没有找到结束^
。
间接答案:就像Andy-Lester评论的那样,你的正则表达式过于复杂,对于不是正则表达式大师的人来说几乎是不可读的。我使用以下更易读和更易维护的内容。
$req_regex = array(
'/[A-Z]/', //uppercase
'/[a-z]/', //lowercase
'/[^A-Za-z]/' //non-alpha
);
foreach($req_regex as $regex) {
if( !preg_match($regex, $password) ) {
return NULL;
}
}
答案 2 :(得分:0)
你给出的表达式的问题是你没有表达式周围的分隔符。
对于复杂的正则表达式,最好将它们逐个构建。我发现Firefox的附加组件(https://addons.mozilla.org/en-us/firefox/addon/rext/)很有用。