2

我想查看变量是否包含与硬编码列表中的几个值之一匹配的值。我正在使用以下内容,但最近发现它在某处存在缺陷:

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

我发现如果变量 $status 包含单词“未发布”,即使列表中没有“未发布”,仍然存在匹配项,可能是因为“未发布”一词包含“已发布”,但我认为 ^ 和正则表达式中的 $ 应该强制匹配整个单词。任何想法我做错了什么?

4

3 回答 3

4

修改你的模式:

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

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

该模式表示我们的字符串必须是/^init$/or /^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 回答