Нормализация строк для сопоставления текста с preg_replace - PullRequest
0 голосов
/ 07 апреля 2011

Я выполняю довольно простое сопоставление текста между набором имен из моей базы данных MySQL и набором строк из файла CSV. Перед фактическим сравнением я запускаю preg_replace с массивом опций для нормализации строк. Одна из важных замен - изменение неправильных сокращений в регулярные полные слова. Но я не могу захватить такие сокращения, как "Inc." и "Inc", "Corp." и «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
}

Вот некоторые совпадения, которые не работают (еще не все):

Стог сена => Игла

  • "Овен Интернешнл Инк." => "Aries Intl. Inc."
  • "Корпорация Фелпс Додж" => "Корпорация Фелпс Додж"
  • "МакДермотт инкорпорейтед" => "МакДермотт инк."

Насколько я могу судить, это не ловит "Inc." и "Corp.", по крайней мере, не последовательно. Любая помощь?

1 Ответ

2 голосов
/ 07 апреля 2011

Поставьте \b сразу после сокращения, за которым следует точка, которая является необязательной, например:

$patterns[2] = '/\bAssoc\b\.?/';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...