2

ハードコードされたリストのいくつかの値のいずれかに一致する値が変数に含まれているかどうかを確認したいと考えています。以下を使用していましたが、最近、どこかに欠陥があることがわかりました。

if (preg_match("/^(init)|(published)$/",$status)) {
    echo 'found';
} else {
    echo 'nope';
}

変数 $status に「unpublished」という単語が含まれている場合、「unpublished」という単語がリストに含まれていなくても一致することがわかりました。これは、「unpublished」という単語に「published」という単語が含まれているためと思われますが、^ と正規表現の $ は、単語全体の一致を強制することになっています。私が間違っていることはありますか?

4

3 に答える 3

4

パターンを変更します:

$pattern = "/^(init|published)$/";
$contain = "unpublished";

echo preg_match($pattern, $contain) ? 'found' : 'nope' ;

このパターンは、文字列が/^init$/または/^published$/でなければならないことを示しています。これは、特定の文字列を最初から最後まで意味します。したがって、これらの制約の下では部分文字列を一致させることはできません。

于 2012-12-04T16:42:42.483 に答える
1

この場合、正規表現は使用する適切なツールではありません。

候補者にチェックしてもらいたい単語を配列に入れるだけです。

$list = array('init', 'published');

次に確認します。

if (in_array($status, $list)) { ... }
于 2012-12-04T16:43:24.553 に答える
0

^文字列の先頭に一致します。 $文字列の終わりに一致します。

ただし、正規表現は、あらゆる機会に使用する必要がある魔法の弾丸ではありません。

この場合、必要なコードは次のとおりです。

if ( $status == 'init' || $status == 'published' )

値のリストと照合する場合は、それらの値に基づいて配列を作成してから、キーが配列に存在するかどうかを確認します。

于 2012-12-04T16:41:39.553 に答える