我想看看变量是否包含与硬编码列表中的一些值匹配的值。我使用以下内容,但最近发现它有一个缺陷:
if (preg_match("/^(init)|(published)$/",$status)) {
echo 'found';
} else {
echo 'nope';
}
我发现,如果变量$ status包含“未发布”一词,即使“未发布”不在列表中,仍然存在匹配,因为“未发布”一词包含“已发布”一词,但我认为正则表达式中的^和$应该强制匹配整个单词。我有什么想法我做错了吗?
答案 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' )
如果要检查值列表,请根据这些值创建一个数组,然后检查数组中是否存在该键。