找到正则表达式匹配时返回0(PHP)

时间:2015-02-28 08:56:15

标签: php regex range preg-match inverse

我希望在字符串中找到2011-2016时返回0。对于我的生活,我无法弄清楚当找到匹配时将返回0的正则表达式和没有匹配时返回1的正则表达式。是的,我可以轻易否定整个声明,但我希望找到一个解决方案,以便我的代码可以保持整洁。有点强迫症?是的,希望你能提供帮助,这里是PHP代码。好,我还在学习。我希望改变的代码是在数组的最后一个元素下的函数passCheck变量$ patternArray。这就是我目前的模式。我希望在字符串中找到2011-2016时返回0。我已经调查了前瞻性的东西,也许它已经很晚了,但我无法绕过它(可能不是正确的方法)。

<?php function digitsStr($pass)
     {
        $nums=array();
        $splt=str_split($pass);
        $count=count($splt);
        for($i=0;$count>$i;$i++)
        {
            if(preg_match("/\d/", $splt[$i])==1)
            {
                array_push($nums, $splt[$i]);
                unset($splt[$i]);
            }
        }
        $nums=array_merge($nums, $splt);
        $str=implode($nums);
        return $str;
    }
    ?>

    <?php function passCheck($string)
    {
        $string=digitsStr($string);
        $len=strlen($string);
        $msgArray=array("Must be 8-16 characters long ",
            "Cannot contain a white space ",
            "Does not contain at least 2 digits ",
            "Must contain at least 1 uppercase ",
            "Must contain at least 1 lowercase ",
            "Must contain one special charcter",
            "Cannot contain years 2011-2016");
        $patternArray=array("/^.{8,16}$/",
            "/\S{".$len."}/",
            "/\d{2,}/",
            "/[A-Z]/",
            "/[a-z]/",
            "/([!-\/]|[:-@])/",
            "/201(?![1-6])/");
        for($i=0;count($patternArray)>$i;$i++)
        {
            if(preg_match($patternArray[$i], $string)==0)
            {
                echo $msgArray[$i];
            }
        }
    }
    ?>

    <?php 
    $string="#M2010ATt123";
    passCheck($string)
    ?>

1 个答案:

答案 0 :(得分:1)

首先,preg_match返回true或false,它不会返回0或1.由于PHP是每周输入的,所以这并不重要,但它可以。最好注意它。

您应该添加逻辑,告诉您模式是否必须匹配,或者是否必须匹配。

像这样:

$patternArray = array(
    array("/^.{8,16}$/", true),
    array("/\s/", false),
    array("/\d.*\d/", true), 
    array("/[A-Z]/", true), 
    array("/[a-z]/", true), 
    array("/([!-\/]|[:-@])/", true), 
    array("/201[1-6]/", false) 
);   
for($i=0;count($patternArray)>$i;$i++) {
    if(preg_match($patternArray[$i][0], $string) == $patternArray[$i][1])

另请注意,我更正了至少2个数字&#39;的模式。你的模式要求他们互相跟随。我改变了模式,因为它不能包含空格&#39;。像这样你不需要额外的变量。