为什么preg_match()总是在部分匹配时验证为true?

时间:2015-12-16 17:39:08

标签: php regex

最近使用正则表达式进行了解释,当我尝试确认C:/Sonar/sonar-runner-dist-2.4/sonar-runner-2.4/projects/函数未返回预期结果(preg_match())时。我已经意识到我的正则表达式会在部分匹配和完全匹配时评估为真。

任何更有经验的人都能分享一些关于为何这样做的评论吗?

我使用以下代码对此进行了测试:

false

在这种情况下,正则表达式返回<?php # Storing regexp. $pattern = "/Banana|Apples/i"; # Storing value that will be compared against regexp. $value = "Chiiiiiiiibanana"; # Testing how preg_match is dealing with the regexp. if (preg_match($pattern, $value, $matches)) { echo "It's a match!\n"; # In case there's matches, print them. print_r($matches); } else { echo "Sorry, not a match."; } ?> (true),尽管“1”为“bananas”前缀。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

要避免任何部分匹配,您必须使用锚点:

  • ^ - 字符串的开头
  • $ - 字符串结束。

所以使用

$pattern = "/^(?:Banana|Apples)$/i";

请参阅demo

由于您有另一个列表,因此需要对它们进行分组,以便锚点正确应用,而不仅仅是第一个和最后一个备选方案。如果您使用"/^Banana|Apples$/i",则banana中的bananasapples中的=apples会匹配。{/ p>

要仅对备选项进行分组但不存储在任何捕获组中,可以使用非捕获组((?:....))。此外,您不需要捕获整个模式上设置的组,因为整个匹配文本始终存储在组0中。