【问题标题】:Problem with stristr text matching in PHPPHP中stristr文本匹配的问题
【发布时间】:2011-04-04 22:01:03
【问题描述】:

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

“拉特兰拉特兰 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.” => “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
}

现在还不是很优雅,如果能提供任何关于如何规范化字符串以进行匹配的额外见解,我将不胜感激。

【问题讨论】:

  • 请发布您的一些代码。

标签: php string-matching textmatching


【解决方案1】:

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

一种避免这种情况且副作用很小的便捷方法是对针头和草垛进行预处理:

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

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

【讨论】:

  • 我还会做进一步的规范化,比如小写。
  • 剥离变音符号(使用iconv)也是一个好方法。加上除[a-z]之外的所有内容。
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多