конвертируйте оба шаблона и $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;
Вот тестовый пример, чтобы проверить, позволяет ли преобразование Юникода совпадать с арабскими буквами в 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 />';
}
}
при выполнении выдает:
لدي أربعة أولاد
لدي خمسة أرانب
Я удалил некоторые из шаблонов, чтобы проверить, работает ли обычная проверка на арабские произведения, которая, кажется, работает.