0

正規表現を使用して、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
}
4

3 に答える 3

2

文字範囲を使用するだけです: [0-9].

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

「6」が必要ない状況に陥ったことがある場合は、必要に応じて「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!';
    }
?>

あるいは、これを行うための機能をすでに提供しているようです。

于 2013-11-13T13:50:25.720 に答える
1

すべての条件がAND結合されているようです。その次の先読みベースの正規表現では、あなたのために働くはずです:

preg_match('/(?=[^0]*0)(?=[^1]*1)(?=[^2]*2)(?=[^3]*3)(?=[^4]*4)(?=[^5]*5)(?=[^6]*6)(?=[^7]*7)(?=[^8]*8)(?=[^9]*9)./', $str)
于 2013-11-13T13:55:41.867 に答える