0

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

"完整的 Cmte. Rutland Rutland VT 会员城市"

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

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

干草堆 => 针

  • "Full Cmte. Member City of Ocala Ocala FL" => "City of Ocala Ocala FL"
  • “水和卫生区安东尼新墨西哥州全董事会成员”=>“安东尼水和卫生区”
  • “能源清洁空气与气候变化 Subcmte Member Consol Inc.” => “康索尔公司”
  • “委员会成员;综合服务高级副总裁 Burke Inc. Cincinnati OH”=>“Burke Inc.”
  • “德克萨斯州圣安东尼奥市” => “德克萨斯州圣安东尼奥市”
  • “完整的 Cmte 成员 United National Indian Tribal Youth Inc. (UNITY)” => “United National Indian Tribal Youth Inc.”
  • “ECA&CC Sub. Member Cyprus Amax Minerals Inc.” => “塞浦路斯 Amax 矿产公司”
  • “硅谷制造集团”=>“硅谷制造集团”
  • “总裁全球环境资源公司华盛顿特区”=>“全球环境资源公司”
  • “兰开斯特实​​验室公司” =>“兰开斯特实​​验室公司”

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

它现在并不是非常优雅,我希望能获得任何关于如何规范化字符串以进行匹配的额外见解。

4

1 回答 1

4

我的猜测是您通过浏览器以 html 的形式查看此内容,因此(多个)空白全部压缩为一个空格。这样看起来应该匹配,但事实并非如此。

防止这种情况发生的一种方便的方法,几乎​​没有副作用,是对针和干草堆进行预处理:

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

trim()是为了解决由前导或尾随空格引起的问题。

于 2011-04-04T22:07:11.723 回答