спасибо за ответы:
«регулярное выражение для обнаружения чисел, написанных как слова»:
регулярное выражение для обнаружения чисел, написанных как слова
У меня теперь есть эта работа, однако у меня есть одно и то же требование, но числа в виде слов на арабском (или любом другом 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)
Ресурсы :