UTF-8 и preg_match с модификатором /u

camka

не самка
UTF-8 и preg_match с модификатором /u

хочу определьть имеются ли в UTF-8 закодированной строке русские буквы. нашел модификатор /u в регулярных выражениях. нашел синтакс использования для таких случаев


2. In a pattern, the escape sequence \x{...}, where the contents of the braces is a string of hexadecimal dig-
its, is interpreted as a UTF-8 character whose code number is the given hexadecimal number, for example:
\x{1234}. If a non-hexadecimal digit appears between the braces, the item is not recognized. This escape
sequence can be used either as a literal, or within a character class.


cделал тест

PHP:
<?php
header('Content-Type: text/html; charset=utf-8');
$str = chr(hexdec('d0')).chr(hexdec('90'));
echo $str;
if (preg_match("/\x{d090}/u", $str))
	echo '<hr>';
?>
выводит красивую букву А и все. а я жду <hr>. Ничего не могу с этим поделать. То ли синтакс с фигурными скобками не поддерживается, то ли еще что.
 

camka

не самка
нет. надо указывать диапазон. да и вообще из принципа и из любопытства хочется узнать, как эти {} скобки можно заставить работать.

например надо сделать такое выражение

[\x{d090}-\x{d0bf}\x{d180}-\x{d18f}\x{d081}\x{d191}]

с однобайтным шестнадцатиричным синтаксисом не покатит. он будет проверять любые байты, независимо, являются ли они младшими или старшими байтами отдельно взятого юникод-символа.
 

neko

tеam neko
а стоп

[\xd090]

либо я вообще ничего не понял

-~{}~ 12.07.04 19:54:

нет, походу это не то
прошу прощения
 

camka

не самка
пока остановился на таком решении
PHP:
preg_match("/(\xd0[\x90-\xbf])|(\xd1[\x80-\x8f])|\xd0\x81|\xd1\x91/", $str)
в надежде, что d0 и d1 последовательности не встречаются в младших байтах, а если и встречаются, то старший байт следующего символа не попадает нужный диапазон. Однако, проблема фигурных скобок не дает покоя.
 
Сверху