无法在PHP中正确使用正则表达式

时间:2012-12-06 20:52:22

标签: php regex

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

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

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

3 个答案:

答案 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/)很有用。