缩短preg_match(或)代码

时间:2013-11-13 13:48:14

标签: regex preg-match

我试图使用正则表达式使程序匹配必须包含0-9的字符串。 这是正确的但它看起来似乎很长。有没有人有这个代码的替代品?

if($str = (preg_match('/[1]/', $str) && preg_match('/[2]/', $str)     
  && preg_match('/[3]/', $str) && preg_match('/[4]/', $str)     
  && preg_match('/[5]/', $str) && preg_match('/[6]/', $str)     
  && preg_match('/[7]/', $str) && preg_match('/[8]/', $str)     
  && preg_match('/[9]/', $str) && preg_match('/[0]/', $str))) {
    //do something
}

3 个答案:

答案 0 :(得分:2)

只需使用字符范围:[0-9]

if (preg_match('/[0-9]/', $str)) {
    echo 'It does.';
} else {
    echo 'It doesn\'t.';
}

如果您曾经处于不想要“6”的情况下,如果您真的想要,您甚至可以将其更改为[012345789]


正如Floris所提到的,您的代码非常令人困惑 - 如果您希望所有字符至少单独显示一次,则只需使用strpos循环:

<?php
    $match = true;
    for ($i = 0; $i < 9; $i++) {
        if (strpos($string, (string)$i) === false) {
            $match = false;
            break; //No need to continue the loop - we already got our answer
        }
    }

    if ($match) {
        echo 'Yes!';
    } else {
        echo 'No!';
    }
?>

Alternatively, I apparently already gave you a function to do this?

答案 1 :(得分:1)

您似乎已将所有条件 ANDed 放在一起。在下面的基于前瞻性的正则表达式应该适合你:

preg_match('/(?=[^0]*0)(?=[^1]*1)(?=[^2]*2)(?=[^3]*3)(?=[^4]*4)(?=[^5]*5)(?=[^6]*6)(?=[^7]*7)(?=[^8]*8)(?=[^9]*9)./', $str)

答案 2 :(得分:1)

如果你想确保你的字符串包含所有数字0-9,你应该删除任何不是数字的东西,然后只采用独特的字符,并确保字符串长度为10.这比表达式更紧凑但不一定更快。 php function count_chars完成了大部分工作(使用mode = 3):

$str = "12345abcde789d9999969";
preg_match_all('/\d+/', $str, $matches);
$distinct = strlen(count_chars(join($matches[0]),3));
if($distinct==10)
{
  echo "all ten digits are present<br>";
}
else 
{
  echo "not all digits are present<br>";
}
echo "there are " . $distinct . " distinct digits<br>";

以上输出:

not all digits are present
there are 9 distinct digits