我试图使用正则表达式使程序匹配必须包含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
}
答案 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