تعبير منتظم للكشف عن الأرقام المكتوبة ككلمات - إدخال UTF -8

StackOverflow https://stackoverflow.com/questions/3630082

سؤال

شكرا على الإجابات على:

"تعبير منتظم للكشف عن الأرقام المكتوبة ككلمات":

تعبير منتظم للكشف عن الأرقام المكتوبة ككلمات

لدي الآن هذا العمل ، ومع ذلك لدي نفس المتطلبات ولكن أرقام الكلمات باللغة العربية (أو أي 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) 

موارد :

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top