我发现当preg_match
包含认可,计划和快乐等字词时,我的$_POST['subject']
代码会被激活。我如何调整我的正则表达式,以防止这种情况发生?我只希望它匹配单词credit或gram或app(case不重要,因此'i') - 而不是包含它们的单词。
if(preg_match("/credit|gram|app/i", $_POST['subject']))
答案 0 :(得分:1)
克里斯,一般来说,如果你想要匹配一个确切的单词,你需要在单词周围添加单词边界:
if(preg_match("/\bcredit\b|\bgram\b|\bapp\b/i", $_POST['subject']))
边界\b
不消耗任何字符。它断言,一方面有“单词字符”,另一方面则没有。
这只是确保匹配整个单词的几种方法之一,但它是最简单的方法之一。对于更复杂的情况,经常使用前瞻和后视。
另一个选项是Joe提到的选项:如果实际上你试图匹配整个字符串,那么你可以通过在字符串锚^
和{{1}的开头和结尾之间构建它来断言}
这会给你:
$
请注意,在if(preg_match("/^(?:credit|gram|app)$/i", $_POST['subject']))
和^
之间,我们将替换放在括号中。这确保了匹配的单词,它将是整个字符串。
交替开始时的$
就是指示括号是非捕获的。