Intereting Posts
получение высоты и ширины изображения из zip-файлов как обновить исходный код файла php через другой php-файл Как я могу позволить моему пользователю вставлять HTML-код без риска? (не только технические риски) Smarty и Ajax PHP: пример формы, который будет шифровать строку запроса (GET) (скрытие данных, а не безопасность) просмотр pdf в виде потока изображений – php Сложность с объединением 3 таблиц в запросе в php Codeigniter: вызов функции функции-члена () в нуле Получение записи базы данных, установленной в массив в php Как я могу использовать свою учетную запись GMAIL для отправки электронной почты с помощью PHP? Удалите пустые элементы массива с помощью array_filter с функцией обратного вызова Шифрование PHP magento cookie Как проверить, установлен ли Suhosin? Доступ к переменной parent из подкласса php и родительского ключевого слова? Ошибка PHP / MYSQL: mysql_num_rows (): предоставленный аргумент недействителен

регулярное выражение для обнаружения чисел, написанных как слова – вход UTF-8

спасибо за ответы:

«регулярное выражение для обнаружения чисел, написанных как слова»:

регулярное выражение для обнаружения чисел, написанных как слова

У меня теперь есть эта работа, однако у меня есть одно и то же требование, но числа в виде слов на арабском (или любом другом UTF-8), а не на английском, поэтому:

if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/", $str, $matches) > 0) return true; 

Не работает. У меня есть googled, и, кажется, довольно много проблем с preg_match и строкой UTF-8, но я не мог найти ни одного из найденных предложений. Любая помощь очень ценится.

Обратите внимание, что \b может работать не так, как вы ожидаете. \b указывает границу слова , но то, что считается символом слова PCRE, зависит от того, в каком языке выполняется скрипт (взгляните на нижнюю часть справочной страницы escape-последовательностей PCRE ):

Символом «слово» является любая буква или цифра или символ подчеркивания, то есть любой символ, который может быть частью слова «Perl». Определение букв и цифр контролируется таблицами символов PCRE и может варьироваться в зависимости от соответствия языкового соответствия. Например, в «fr» (французском) языке, для символов с акцентом используются некоторые коды символов, превышающие 128, и они сопоставляются символом \ w.

Вам также может потребоваться прочитать « Обработка UTF-8 с PHP» (в частности, раздел PCRE).

Вместо этого вы можете использовать обратную связь в сочетании со свойством символа Юникод для эмуляции границы слова: (?<=\P{L}) . Это утверждает, что предыдущий символ не является буквой «Юникод».

Таким образом, все это будет выглядеть так:

 /(?<=\P{L})(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\s*?){4}/ 

конвертировать оба шаблона и $str в windows-1256 , выполнять сопоставление, а затем конвертировать $matches элементов обратно (если необходимо), это решение, с которым я пришел после страдания в течение некоторого времени.

 $pattern="/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/"; $pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern); $str_windows1265 = iconv('utf-8', 'windows-1256', $str); if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) return true; ستة | سبعة | ثمانية | تسعة | صفر | عشرة $pattern="/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/"; $pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern); $str_windows1265 = iconv('utf-8', 'windows-1256', $str); if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) return true; 

Вот пример теста, чтобы проверить, разрешает ли преобразование в Юникоде арабские буквы в preg_match:

 <?php $pattern="/(واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)/"; $pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern); $test_cases=array( 'لدي أربعة أولاد', 'قفز الثعلب فوق الشجرة', 'عندي خمسة أرانب', ); foreach ($test_cases as $str) { $str_windows1265 = iconv('utf-8', 'windows-1256', $str); if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) { echo $str, '<br />'; } } خمسة | ستة | سبعة | ثمانية | تسعة | صفر | عشرة <?php $pattern="/(واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)/"; $pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern); $test_cases=array( 'لدي أربعة أولاد', 'قفز الثعلب فوق الشجرة', 'عندي خمسة أرانب', ); foreach ($test_cases as $str) { $str_windows1265 = iconv('utf-8', 'windows-1256', $str); if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) { echo $str, '<br />'; } } 

при выполнении он выводит:

 لدي أربعة أولاد لدي خمسة أرانب 

Я удалил часть шаблона, чтобы проверить, работает ли обычная проверка на арабском языке, которая, кажется, работает.

Вы можете использовать модификатор шаблона u для использования любого языка, поддерживаемого UTF-8.

 if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/u", $str, $matches) > 0) 

Ресурсы :

  • Модификаторы шаблонов