PHP中的stristr文本匹配问题

时间:2011-04-04 22:01:03

标签: php string-matching textmatching

我正在运行一个相当简单的脚本,它尝试将来自csv文件的字符串与mysql表中的潜在匹配项进行匹配(排序规则:ut8_general_ci)。对于csv文件中的每一行,我都会拉出我想要的字符串(haystack),它看起来像这样:

“Full Cmte.Rutland Rutland VT成员城市”

对于每个字符串,我从我的数据库中提取匹配列表,并循环遍历它们直到stristr找到匹配项。 (我使用stristr而不是正则表达式因为它更简单并且(我认为?)更快。)一些匹配的字符串不具有语法/句法意义,因为它们被构造为特定于此数据集的别名。其中一个是“Rutland Rutland VT市”(“拉特兰市(VT)”的别名),它应该但不符合上面的字符串。对于超过90%的这些比赛,我没有任何问题。但是,某些文本匹配似乎不起作用。

以下是未能产生匹配的列表:

Haystack =>针

  • “Full Cmte.Ocala Ocala FL成员城市”=> “Ocala Ocala FL市”
  • “全体成员水和卫生区Anthony NM”=> “水和卫生区安东尼”
  • “Energy Clean Air& Climate Change Subcmte Member Consol Inc.” => “康索尔公司”。
  • “Full Council Member;综合服务高级副总裁Burke Inc. Cincinnati OH”=> “伯克公司”。
  • “圣安东尼奥市TX”=> “圣安东尼奥市TX”
  • “Full Cmte member United National Indian Tribal Youth Inc.(UNITY)”=> “联合国印第安部落青年公司”。
  • “ECA& CC Sub。会员塞浦路斯Amax Minerals Inc.” => “塞浦路斯阿马克斯矿业公司”。
  • “Silcon Valley Manufacturing Group”=> “Silcon Valley制造集团”
  • “Global Global Environmental Inc. Inc. Washington DC”=> “全球环境资源公司”。
  • “Lancaster Laboratories Inc.” => “Lancaster Laboratories Inc.”

我不知道该怎么做,除非这是我完全错过的非常基本的东西。似乎大多数错误都有“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
}

现在它并不是非常优雅,我将非常感谢如何规范化字符串以进行匹配。

1 个答案:

答案 0 :(得分:4)

我的猜测是你通过浏览器查看这个,如html,这样(多个)空白都凝聚到一个空格。通过这种方式,看起来像它应该匹配,但它没有。

一种方便的方法来防止这种情况,副作用很小,就是对针头和大海捞针进行预处理:

$needle = trim(preg_replace('/\s+/',' ',$needle));
$haystack = trim(preg_replace('/\s+/',' ',$haystack));

trim()用于解决由前导空格或尾随空格引起的问题。