0

I'm trying to find if a substring exists inside of a larger string. The match has to be exact. Most of the time it works be in the scenario below it says its an exact match even though it is not.

$partnumber = "4.7585";
$productname = "Eibach 4.7585.880 Sport Plus Kit"

if(preg_match('/^.*(\b'.$partnumber.'\b).*$/i', $productname)){
      echo "****************Exact Match****************";
}

It should only match if the $partnumber = '4.7585.880';

As a note, the partnumber could change, it could contain numbers, letters, decimals or dashes.

4

2 回答 2

2

you need to escape $partnumber using preg_quote():

$partnumber = "4.7585";
$productname = "Eibach 4.7585.880 Sport Plus Kit"

if(preg_match('/[^\B\.]'.preg_quote($partnumber).'[^\B\.]/i', $productname)){
    echo "****************Exact Match****************";
}

I've also simplified your regular expression by just searching for the partnumber instead of the start and end of the line and everything that might be surrounding it.

于 2012-10-16T05:47:19.143 回答
1

\b正则表达式标识符匹配单词边界。单词字符定义为 [ a -zA-Z0-9_],因此 \b 将匹配任何单词字符和任何非单词字符之间的边界。如果第一个(或最后一个)字符是单词字符,它还将匹配字符串的开始(或结束)。(请参阅此处了解更多信息。)

在您的示例中,第二个“。” 是非单词字符,因此它与您的正则表达式匹配。如果部件号总是在句子的中间,你可以使用 \s 来匹配它周围的空格。如果它可能位于句子的末尾(即,后跟一个“。”),那么我认为您将需要一个更复杂的正则表达式,它可以查看匹配后的字符以检查匹配是否完整。

此外,正如 Omar Jackman 所说,您确实需要转义零件号。在您提供的示例中,产品名称“ Eibach 4X7585 Sport Plus Kit ”也将匹配,因为“.” 在零件编号中将被解释为正则表达式的一部分。根据这个问题preg_quote是您正在寻找的 php 函数。

于 2012-10-16T06:01:06.880 回答