Проблема с соответствием текста stristr в PHP

Я запускаю довольно простой скрипт, который пытается сопоставить строки из CSV-файла с потенциальными совпадениями в таблице MySQL (сопоставление: ut8_general_ci). Для каждой строки в файле csv я вынимаю нужную строку (стог сена), которая выглядит примерно так:

"Full Cmte. Член города Ратленд Ратленд В.Т."

Для каждой строки я извлекаю список совпадений из своей базы данных и перебираю их, пока stristr не найдет совпадение. (Я использую stristr вместо regex, потому что это проще и (я думаю?) Быстрее.) Некоторые из соответствующих строк не имеют грамматического / синтаксического смысла, потому что они созданы как псевдонимы, специфичные для этого набора данных. Одним из них является "Город Ратленд Рутленд VT" (псевдоним "Город Ратленд (VT)"), который должен, но не соответствует строке выше. Для более чем 90% этих матчей у меня нет проблем. Тем не менее, определенное сопоставление текста не работает.

Вот список тех, кто не может найти совпадение:

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

  • "Полный член. Город Окала, Окала, Флорида" => "Город Окала, Окала, Флорида"
  • "Полный член совета по водоснабжению и санитарии округа Энтони" => "Водоснабжение и санитария округа Энтони"
  • "Энергетически чистый воздух и изменение климата Subcmte Member Consol Inc." => "Консоль Инк"
  • "Действительный член Совета; старший вице-президент по интегрированным услугам Burke Inc. Cincinnati OH" => "Burke Inc."
  • "Город Сан-Антонио, Техас" => "Город Сан-Антонио, Техас"
  • "Действительный член Объединенной национальной индийской племенной молодежной компании (UNITY)" => "Объединенная национальная индийская племенной молодежной компании"
  • "ECA & CC Sub. Член Кипра Amax Minerals Inc." => "Кипр Amax Minerals Inc."
  • "Silcon Valley Manufacturing Group" => "Silcon Valley Manufacturing Group"
  • "Президент Global Environmental Resources Inc. Вашингтон, округ Колумбия" => "Global Environmental Resources 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
}

Сейчас это не очень изящно, и я был бы признателен за любую дополнительную информацию о том, как нормализовать строки для сопоставления.

1 ответ

Решение

Я предполагаю, что вы просматриваете это через браузер, как HTML, так что (несколько) пробелов все сгущается в один пробел. Таким образом, похоже, что оно должно совпадать, но это не так.

Удобный способ предотвратить это с небольшими побочными эффектами - это предварительно обработать иглу и стог сена:

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

trim() решить проблемы, вызванные пробелами в начале или в конце.

Другие вопросы по тегам