我正在运行一个相当简单的脚本,它尝试将 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
}
它现在并不是非常优雅,我希望能获得任何关于如何规范化字符串以进行匹配的额外见解。