Как заставить strpos в PHP соответствовать символам иностранного языка?

Согласно моим источникам, которые говорят по-испански, если я ищу шаблон "pan" в списке строк, который содержит оба этих значения:

$normalString = "abcpan123";
$specialString = "abcpañ123";

он должен соответствовать обоим из них - например. strpos("pan", $normalString) и strpos("pan", $specialString) должны оба возвращать '3'.

Однако только первый возвращает неложное значение.

Если я выполняю аналогичный поиск в mySQL для «как «% pan%», он соответствует обеим строкам.

Предположительно, эта ситуация относится не только к н-тильде, но и к другим символам, модифицированным ударениями и т. д.

Я озадачен тем, как справиться с этим... кажется, что проблема, с которой другие должны были столкнуться и решить, но я не нашел хорошего существующего решения. Я надеялся на какую-то другую функцию в PHP или какую-то конфигурацию, но без радости.

Конечно, я мог бы написать собственный код с регулярными выражениями вместо использования strpos(), но я даже не уверен, как определить на нескольких иностранных языках, какие символы будут считаться эквивалентными.

Любая помощь для меня?


person tristan    schedule 15.03.2012    source источник


Ответы (1)


strpos сравнивает символы как они есть, а «n» — это просто не «ñ». На самом деле он просто сравнивает байты, он даже не будет знать о разных кодировках. Если вам нужно сравнение с учетом локали и сопоставления, используйте strcoll. Прочитайте комментарии, там не так много документации по этому поводу.

База данных включает настройку сопоставления по умолчанию, что позволяет выполнять такой нечеткий поиск.

Альтернативой может быть нормализация всех строк до простых символов ASCII перед их сравнением с использованием iconv('UTF-8', 'ASCII//TRANSLIT', $string).

person deceze♦    schedule 15.03.2012
comment
Вызов iconv() отлично работает для меня в скрипте командной строки php, но, похоже, не работает правильно, когда я запускаю php через apache. Есть идеи, почему? - person tristan; 16.03.2012