我正在运行一个相当简单的脚本,它尝试将来自csv文件的字符串与mysql表中的潜在匹配项进行匹配(排序规则:ut8_general_ci)。对于csv文件中的每一行,我都会拉出我想要的字符串(haystack),它看起来像这样:
“Full Cmte.Rutland Rutland VT成员城市”
对于每个字符串,我从我的数据库中提取匹配列表,并循环遍历它们直到stristr找到匹配项。 (我使用stristr而不是正则表达式因为它更简单并且(我认为?)更快。)一些匹配的字符串不具有语法/句法意义,因为它们被构造为特定于此数据集的别名。其中一个是“Rutland Rutland VT市”(“拉特兰市(VT)”的别名),它应该但不符合上面的字符串。对于超过90%的这些比赛,我没有任何问题。但是,某些文本匹配似乎不起作用。
以下是未能产生匹配的列表:
Haystack =>针
我不知道该怎么做,除非这是我完全错过的非常基本的东西。似乎大多数错误都有“inc”。在比赛中,但不确定是什么导致了它。
这是代码(尽管下面的答案符合法案):
$patterns = array();
$patterns[0] = '/\s+/';
$patterns[1] = '/&/';
$replacement = array();
$replacement[0] = ' ';
$replacement[1] = 'and';
$name = trim(preg_replace($patterns,$replacement,$name));
if(stristr($name,trim(preg_replace($patterns,$replacement,$org->org_name)))) {
// code here
}
现在它并不是非常优雅,我将非常感谢如何规范化字符串以进行匹配。
答案 0 :(得分:4)
我的猜测是你通过浏览器查看这个,如html,这样(多个)空白都凝聚到一个空格。通过这种方式,看起来像它应该匹配,但它没有。
一种方便的方法来防止这种情况,副作用很小,就是对针头和大海捞针进行预处理:
$needle = trim(preg_replace('/\s+/',' ',$needle));
$haystack = trim(preg_replace('/\s+/',' ',$haystack));
trim()
用于解决由前导空格或尾随空格引起的问题。