تعبير منتظم للكشف عن الأرقام المكتوبة ككلمات - إدخال UTF -8
-
26-09-2019 - |
سؤال
شكرا على الإجابات على:
"تعبير منتظم للكشف عن الأرقام المكتوبة ككلمات":
تعبير منتظم للكشف عن الأرقام المكتوبة ككلمات
لدي الآن هذا العمل ، ومع ذلك لدي نفس المتطلبات ولكن أرقام الكلمات باللغة العربية (أو أي UTF-8 آخر) وليس الإنجليزية ، لذلك:
if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/", $str, $matches) > 0)
return true;
لا يعمل - لقد غوغل ويبدو أن هناك عدد قليل من المشكلات مع سلسلة Preg_Match و UTF -8 ، لكنني لم أستطع الحصول على أي من الاقتراحات التي تم العثور عليها. أي مساعدة موضع تقدير كبير.
المحلول
لاحظ أن \b
قد لا تعمل كما تتوقع. \b
يحدد أ حدود الكلمة, ، ولكن ما يعتبر حرفًا من كلمة من قبل PCRE يعتمد على تحديد موقع البرنامج النصي (ألقِ نظرة على أسفل تسلسل PCRE الهروب الصفحة اليدوية):
شخصية "كلمة" هي أي حرف أو رقم أو شخصية سطحية ، أي أي حرف يمكن أن يكون جزءًا من "Word". يتم التحكم في تعريف الحروف والأرقام بواسطة جداول أحرف PCRE ، وقد تختلف إذا حدثت مطابقة خاصة بالمراقبة. على سبيل المثال ، في لغة "FR" (الفرنسية) ، يتم استخدام بعض رموز الأحرف التي تزيد عن 128 للأحرف المحملة ، ويتم مطابقة هذه w.
قد ترغب أيضًا في القراءة معالجة UTF-8 مع PHP (القسم على PCRE على وجه الخصوص).
بدلاً من ذلك ، يمكنك استخدام أ انظر حولك بالتزامن مع خاصية حرف Unicode لمحاكاة حدود كلمة: (?<=\P{L})
. هذا يؤكد أن الشخصية السابقة ليس Unicode "رسالة".
لذلك ستبدو كلها معًا:
/(?<=\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;
إليك مثال اختبار للتحقق مما إذا كان تحويل Unicode يسمح بمطابقة الحروف العربية في 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 />';
}
}
عند التنفيذ ، سيتم إخراجها:
لدي أربعة أولاد
لدي خمسة أرانب
لقد أزلت بعض النمط للتحقق مما إذا كان الفحص العادي ضد الأعمال العربية ، والذي يبدو أنه يعمل.
يمكنك استخدام معدل النمط u
لاستخدام أي لغة مدعومة UTF-8.
if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/u", $str, $matches) > 0)
موارد :