Классика: preg_match и кириллица в UTF-8

angry.creater

Новичок
Классика: preg_match и кириллица в UTF-8

Господа!
Перерыв инет, маны и что там ещё за последние ~15-16 часов без сна и редкими перекурами, я понял, что у меня на голове не достаёт большей части волос...
дабы не оторвать себе скальп начисто, прошу посильной помощи.

Проблема
для любой кириллической строки в UFT-8 не работают preg_* ф-ции регулярных выражений.

пример:
PHP:
		setlocale(LC_CTYPE, array('ru_RU.utf8', 'ru_UA.utf8'));
		setlocale(LC_ALL, array('ru_RU.utf8', 'ru_UA.utf8'));
		$ary = array();
		if (preg_match('/[^\w]/u', 'русский', $ary)) {
			print "not chars!";
			print_r($ary);
		} else {
			print "chars!";
			print_r($ary);
		}
результат работы скрипта: not chars!

Далее, если заменить строку 'русский' на 'english', скрипт сообщает, что строка собственно является строкой, то есть: chars!

игра с модификатором u в '/[^\w]/u' ни к чему не привела, ровна как и сами вариации (порядка 20 различных вариантов из инета и других форумов) так же не дала ожидаемых результатов.
Явное задание UFT-8, закомментирование и прочие пляски с default_charset так же успехом не увенчались

ИНФА:
php: php-5.2.6 (Win32)
кодировка самого скрипта: ессно UTF-8

ВОПРОСЫ:
1. Работают ли preg_* регулярки PHP с кириллицей в UTF-8 ?
(я слышал, что поддержка модификатора /i - не работает, но остальное вроди-как работать должно)

2. где я ошибаюсь, как следует писать, что бы preg_match('/[^\w]/u', 'русский') работало так, как и ожидается (например, для cp1251 ф-ция отрабатывает корректно)

Большое спасибо, вы мне действительно поможите, если разъясните суть дела, у меня самого руки уже опустились...
~~~
но, регулярка
PHP:
if (preg_match('/^[^0-9A-Za-zА-Яа-яЁё]+$/u', 'русский')
кириллицу в UFT-8 распознаёт корректно.
Однако, такой подход меня не устраивает, так я хочу привязываться ИМЕННО К КЛАССАМ СИМВОЛОВ, а не конкретный набор диаппазона строк на том или ином языке.

и тогда:
ВОПРОСЫ:
1. Работают ли preg_* регулярки PHP с кириллицей в UTF-8 в случае использования КЛАССА СИМВОЛОВ?
(я слышал, что поддержка модификатора /i - не работает, но остальное вроди-как работать должно)

2. где я ошибаюсь, как следует писать, что бы preg_match('/[^\w]/u', 'русский') работало так, как и ожидается (например, для cp1251 ф-ция отрабатывает корректно)
 

Андрейка

Senior pomidor developer
как работают регулярки с utf8 можно посмотреть в описании модификаторов этих самых регулярок
 

alexcrown

Новичок
Некоторые последовательности не работают с юникодом: http://phpclub.ru/talk/showthread.php?postid=776889#post776889
 

angry.creater

Новичок
Автор оригинала: alexcrown
Некоторые последовательности не работают с юникодом: http://phpclub.ru/talk/showthread.php?postid=776889#post776889
Спасибо Вам, но я не совсем понял:

эти последовательности в целях повышения производительности срабатывают только для символов с кодом меньше 255, а русские буквы в юникоде естественно гораздо дальше

и

If you really want to test for a wider sense of, say, "digit", you must use Unicode property tests such as \p{Nd}.

то есть, как "сказать" только буквы для моего примера preg_match('/[^\w]/u', 'русский') для кириллицы в UTF-8 ?

~~~~
так же, какой набор ф-ций, поддерживающих синтаксис регулярных выражений, следует использовать в PHP при работе с UTF-8 ?

-~{}~ 18.05.08 18:06:

Блин!
почитал вот это
http://regexkit.sourceforge.net/Documentation/pcre/pcrepattern.html

вобщем, ВСЁ ОЧЧЕНЬ ПЛОХО, нет поддержки регулярок UTF-8 в PHP...

Народ, ну просто не может быть такого, что бы нельзя было выкрутиться или как-то обойти эти ограничения!!!

вобщем, предложите пожалуйста способ проверки на "только символы" в UTF-8 БЕЗ ПРИВЯЗКИ К КОНКРЕТНОМУ ЯЗЫКУ... ну например, что бы не явно писать для русских: А-Яа-яЁё
"латинцев" : A-Za-z
"корейцев" , китацев и прочее их национальные диаппазоны символов...
 

Андрейка

Senior pomidor developer
ну если на том авторитетном сайте написано, что нету utf-8 в "php" то хз тогда что тебе делать..
 

angry.creater

Новичок
Автор оригинала: Андрейка
ну если на том авторитетном сайте написано, что нету utf-8 в "php" то хз тогда что тебе делать..
нету поддержки КЛАССОВ СИМВОЛОВ, сорри, не верно выразился.

меня интересует ЧЕМ ЗАМЕНИТЬ Ф-НОСТЬ КЛАССОВ СИМВОЛОВ для UTF-8

-~{}~ 18.05.08 18:32:

Автор оригинала: angry.creater
то есть, как "сказать" только буквы для моего примера preg_match('/[^\w]/u', 'русский') для кириллицы в UTF-8 ?
 

Angerslave

Новичок
Мне кажется, или код [^\w] значит "всё, кроме \w, то есть всё, кроме символов, образующих слово"?

-~{}~ 18.05.08 21:35:

Ещё можно попробовать вручную задать [а-яА-ЯёЁ]
 

angry.creater

Новичок
Автор оригинала: Андрейка
http://www.pcre.org/pcre.txt
спасибо... но можно просто пример в одну строку - как переписать preg_match('/[^\w]/u', 'русский') для UTF-8 ?

зы: Angerslave, разумеется, уже парюсь просто , больше суток не сплю )

-~{}~ 18.05.08 18:56:

Автор оригинала: MiksIr
http://ru2.php.net/manual/en/regexp.reference.php
Раздел Unicode character properties
Спасибо!
Но там я уже был, но подстановка этих свойств ничего не дала, видимо, в следствии неправильного их использования, почему и прошу пример в одну строку.

Куда мне эти свойства подставлять, в preg_match ?

как вот это preg_match('/[^\w]/u', 'русский') перепишется с учётом синтаксиса этих Unicode character properties ?

-~{}~ 18.05.08 18:57:

зы: предлагаю сабж добавить в FAQ...
 

Андрейка

Senior pomidor developer
ну вон по той ссылке, которая Но там я уже был все красиво написано..
прокрутив страницу чуть выше можно найти известные тебе значки \w и т.д.
и по аналогии в регулярке заменить их на соответствующие utf-ные..
формат написани этих "свойств" есть,
поэтому вопрос Куда мне эти свойства подставлять непонятен
список свойств тоже есть, надо только выбрать нужное и заменить..

подстановка этих свойств ничего не дала, видимо
так показывай как пробовал
 

angry.creater

Новичок
preg_match('/[^\w]/u', 'русский') становится таким:
preg_match('/[^\pL]/u', 'русский') или
preg_match('/[^\p{L}]/u', 'русский')

зы: почему это нельзя было в обычной документации сразу описать, например, забираемой отсюда: http://www.php.net/download-docs.php
...впрочем, не напрягайтесь, это не вопрос.

ладно, всем спасибо...
 

MurzNN

Новичок
Судя по всему в PHP 5.4 починили косяк с \W, с русскими теперь нормально работает (при указании модификатора u).
Если откатиться на PHP 5.3 - то всё по старому.
Проверял на Ubuntu 12.10.
 
Сверху