regexp مع لانج الروسي
سؤال
لا يمكنني حل مشكلتي مع 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\-]+$/
لقد اختبرت في جميع المتصفحات بما في ذلك سفاري