regexp с русским языком

Я не могу решить свою проблему с regexp.

Ok, когда я набираю:

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

все хорошо, кроме ситуации с русским языком.

Итак, я пытаюсь перепечатать этот reg-exp:

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

но это не работает,

Я знаю некоторые идеи, просто напишите:

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

но это безумие: D

пожалуйста, дайте мне простой вариант

3 ответов


попробуйте диапазон 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"

обратите внимание, что звезда в вашем регулярном выражении является избыточной. Все уже "съедено" плюсом. Это сделало бы то же самое:

"#\[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.modifiers


это сработало для меня:

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

Я тестировал во всех браузерах, включая Safari