使用PHP的preg_match来查看值是否与值列表匹配

时间:2012-12-04 16:38:05

标签: php

我想看看变量是否包含与硬编码列表中的一些值匹配的值。我使用以下内容,但最近发现它有一个缺陷:

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

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

3 个答案:

答案 0 :(得分:4)

修改你的模式:

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

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

此模式表示我们的字符串必须是/^init$//^published$/,这意味着从开始到结束的那些特定字符串。因此,在这些约束条件下,子串不能匹配。

答案 1 :(得分:1)

在这种情况下,正则表达式不适合使用。

只需将您想要候选人的单词放在数组中进行检查:

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

然后检查:

if (in_array($status, $list)) { ... }

答案 2 :(得分:0)

^匹配字符串的开头。 $匹配字符串的结尾。

然而,正则表达并不是一个需要在每个机会都能使用的神奇子弹。

在这种情况下,您想要的代码是

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

如果要检查值列表,请根据这些值创建一个数组,然后检查数组中是否存在该键。