1

我是正则表达式的新手,我正在使用正则表达式进行一些表单验证。但问题是大多数正则表达式都像

^(?=.{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))

我得到至少一个错误。大多数时候它显示错误没有结束分隔符或未知修饰符等

4

3 回答 3

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);
于 2012-12-06T20:55:52.230 回答
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;
    }
}
于 2012-12-06T21:44:13.463 回答
0

您给出的表达式的问题是表达式周围没有分隔符。

对于复杂的正则表达式,最好是零碎地构建它们。我发现 Firefox 的插件(https://addons.mozilla.org/en-us/firefox/addon/rext/)很有用。

于 2012-12-06T20:58:41.510 回答