#php #regex #search #arabic
#php #регулярное выражение #Поиск #Арабский
Вопрос:
Я ищу статьи по ключевым словам, которые есть как на английском, так и на арабском языках. Статьи могут быть как на английском, так и на арабском языках.
Мой текущий код:
$k = implode("|", $keywords);
$regexp = "/(?i)b(".$k.")b/";
preg_match_all( $regexp, $content, $matches );
Но по какой-то причине это не находит ключевые слова в арабских статьях. Я проверил, что и ключевые слова, и статьи читаются правильно; проблем с кодировкой нет.
Что я могу сделать, чтобы исправить это? Обратите внимание, что у меня нет способа определить, на английском или арабском языке написана статья или ключевое слово, поэтому для сопоставления их всех должно быть одно регулярное выражение.
Ответ №1:
В вашем регулярном выражении может просто отсутствовать /u
флаг nicode:
$regexp = "/(?i)b(".$k.")b/u";
В противном случае PCRE должен сравнивать байты. В этом случае он все еще может быть в состоянии найти слова (когда кодировка UTF-8 идентична), но никогда не обнаружит слово b
oundaries.
Обновить
Хорошо, b
на самом деле только определяет w
границы (это зависит от настройки локали вместо флага / u). Тогда попробуйте это вместо этого, которое использует утверждения:
$regexp = "/(?<!p{L})(".$k.")(?!p{L})/ui";
Комментарии:
1. Только что протестировано. Границы слов не работают для арабского языка. Редактировать: Ну, это все объясняет: mail-archive.com/pcre-dev@exim.org/msg00110.html
2. Превосходно! Это имеет смысл. Спасибо за ссылку!