Регулярное выражение PHP: поиск статей как по английскому, так и по арабскому тексту

#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. Превосходно! Это имеет смысл. Спасибо за ссылку!