سؤال

لا يمكنني حل مشكلتي مع regexp.

حسنًا ، عندما أكتب:

$string = preg_replace("#\[name=([a-zA-Z0-9 .-]+)*]#","$name_start $1 $name_end",$string);

كل شيء على ما يرام ، باستثناء الوضع مع اللغة الروسية.

لذا ، أحاول إعادة اختيار هذا reg-exp:

$string = preg_replace("#\[name=([a-zA-Z0-9**а-яА-Я** .-]+)*]#","$name_start $1 $name_end",$string);

لكن هذا لا يعمل ،

أنا أعرف بعض الأفكار ، فقط اكتب:

$string = preg_replace("#\[name=([a-zA-Z0-9йцукенгшщзхъфывапролджэячсмитьбю .-]+)*]#","$name_start $1 $name_end",$string);

لكن هذا مجنون: د

من فضلك ، أعطني البديل البسيط

هل كانت مفيدة؟

المحلول

جرب نطاق Unicode:

'/[\x{0410}-\x{042F}]/u'  // matches a capital cyrillic letter in the range A to Ya

لا تنسى العلم /u لـ Unicode.

في حالتك:

"#\[name=([a-zA-Z0-9\x{0430}-\x{044F}\x{0410}-\x{042F} .-]+)*]#u"

لاحظ أن النجم في regex الخاص بك زائدة عن الحاجة. كل شيء يحصل بالفعل على "أكل" من قبل الزائد. هذا سيفعل نفس الشيء:

"#\[name=([a-zA-Z0-9\x{0430}-\x{044F}\x{0410}-\x{042F} .-]+)]#u"

نصائح أخرى

يوفر البرنامج النصي Unicode الشائع (المدعوم منذ PCRE 3.3) اختبارًا للخاصية السيريلية.

على سبيل المثال ، استبدل جميع الأحرف التي ليست أرقامًا سيريلية ولا (لاتينية):

$string = '1a2b3cйdцeуfкбxюy';
echo preg_replace('/[^0-9\p{Cyrillic}]/u', '*', $string);

يمكنك العثور على وثائق تلك الميزة تحت http://www.pcre.org/pcre.txt "خصائص حرف يونيكود".
وعليك تحديد علامة PCRE8 (U) كما هو موضح في http://docs.php.net/reference.pcre.pattern.modiers

هذا واحد عمل بالنسبة لي:

/^[а-яА-Я\p{Cyrillic}0-9\s\-]+$/ 

لقد اختبرت في جميع المتصفحات بما في ذلك سفاري

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