【问题标题】:Normalizing strings for text matching with preg_replace使用 preg_replace 规范化文本匹配的字符串
【发布时间】:2026-01-31 04:45:01
【问题描述】:

我正在我的 MySQL 数据库中的一组名称和 CSV 文件中的一组字符串之间执行非常简单的文本匹配。在实际比较之前,我使用一组选项运行 preg_replace 来规范化字符串。重要的替代方法之一是将不规则的缩写变成规则的完整单词。但我似乎无法捕捉到像“Inc.”这样的缩写词。和“公司”、“公司”。以及可能有也可能没有尾随句点的“Corp”。

代码如下:

$patterns = array();
$patterns[0] = '/\s+/';
$patterns[1] = '/&/';
$patterns[2] = '/\bAssoc\.{0,1}\b/';
$patterns[3] = '/\bInc(?!\.)\b/';
$patterns[4] = '/\b(L\.?){2}P\.?/';
$patterns[5] = '/\bUniv(\s|\.)+\b/';
$patterns[6] = '/\bCorp\.?/';
$patterns[7] = '/\bAssn\.?/';
$patterns[8] = '/\bUnivesity\b/';
$patterns[9] = '/\bIntl.\b/';

$replacement = array();
$replacement[0] = ' ';
$replacement[1] = 'and';
$replacement[2] = 'Association';
$replacement[3] = 'Inc.';
$replacement[4] = '';
$replacement[5] = 'University';
$replacement[6] = 'Corporation';
$replacement[7] = 'Association';
$replacement[8] = 'University';
$replacement[9] = 'International';

$name = trim(preg_replace($patterns,$replacement,$name));
if(stristr($name,trim(preg_replace($patterns,$replacement,$org->org_name)))) return $org->org_id;
// code here
}

以下是一些无效的匹配项(更多内容即将推出):

干草堆 => 针

  • “白羊座国际公司” => “白羊座国际公司”
  • “菲尔普斯道奇公司”=>“菲尔普斯道奇公司”
  • “麦克德莫特公司”=>“麦克德莫特公司”

据我所知,它没有捕捉到“Inc.”。和“公司”,至少不一致。有什么帮助吗?

【问题讨论】:

  • 一些不工作的样本输入、输出和所需的输出会很棒:)
  • 也许一些单元测试会帮助你消除不确定性
  • \b 可能在点后不匹配,除非紧跟在后面的单词。请不要写{0,1},而是写?

标签: php regex string-matching textmatching


【解决方案1】:

\b 放在缩写后面,然后是一个可选的点,如下所示:

$patterns[2] = '/\bAssoc\b\.?/';

【讨论】: