我正在尝试查找更大字符串中是否存在子字符串。比赛必须准确。大部分时间它都适用于下面的场景,它表示它完全匹配,即使它不是。
$partnumber = "4.7585";
$productname = "Eibach 4.7585.880 Sport Plus Kit"
if(preg_match('/^.*(\b'.$partnumber.'\b).*$/i', $productname)){
echo "****************Exact Match****************";
}
只有$ partnumber ='4.7585.880';
才能匹配作为一个注释,partnumber可能会改变,它可能包含数字,字母,小数或破折号。
答案 0 :(得分:2)
你需要使用preg_quote()
转义$ partnumber:
$partnumber = "4.7585";
$productname = "Eibach 4.7585.880 Sport Plus Kit"
if(preg_match('/[^\B\.]'.preg_quote($partnumber).'[^\B\.]/i', $productname)){
echo "****************Exact Match****************";
}
我还通过搜索partnumber而不是行的开头和结尾以及可能围绕它的所有内容来简化你的正则表达式。
答案 1 :(得分:1)
\ b 正则表达式标识符与字边界匹配。 单词字符定义为[a-zA-Z0-9_],因此\ b将匹配任何单词字符和任何非单词字符之间的边界。如果第一个(或最后一个)字符是单词字符,它也将匹配字符串的开头(或结尾)。 (有关详情,请参阅here。)
在你的例子中,第二个'。'是一个非单词字符,所以它匹配你的正则表达式。如果部件号始终位于句子的中间,则可以使用\ s来匹配它周围的空格。如果它可能在句子的末尾(即后跟'。'),那么我认为你需要一个更复杂的正则表达式,它可以查看匹配后的字符,以检查匹配是否完成。
另外,正如Omar Jackman所说,你确实需要逃避零件编号。在您提供的示例中,产品名称“ Eibach 4X7585 Sport Plus Kit ”也会匹配,因为'。'在部件号中将被解释为正则表达式的一部分。根据{{3}},this question是您正在寻找的PHP函数。