preg_match и русские буковы
Старый баян про кодировку UTF-8, PCRE и русские буквы.
setlocale(LC_ALL, array ('ru_RU.UTF-8'));
preg_match_all("/\w+/u", 'one два three', $matches);
В результате в $matches только два слова 'one' и 'three'.
Обратился к Гуглю, было найдено решение:
preg_match_all("/\pL+/", $mods[$i], $matches);
Но проблема в том, что я вообще не понимаю что есть \pL (на php.net не нашел описалова). Хотелось бы разобраться что это за паттерн такой получается...
Возможно-ли использовать дедовский паттерн (\w+) для работы со строками в UTF-8? Если да, то что для этого нужно?
Возможно-ли использовать дедовский паттерн (\w+) для работы со строками в UTF-8? Если да, то что для этого нужно?
Ага, что-то лучше сложно придумать, я на том же остановился. Разве что [a-zA-Zа-яА-Я] запихнуть в переменную и её вставлять в шаблон, но это те же яйца.
Вообще то есть флаг i ;)
/[a-zа-я]+/ui
А фиг знает....
Это делает его по-другому зависимым от кодировки :) Если написать а-я, то он будет проверять в той кодировке, в которой сохранён сам, а если \x80-\xFF, то в той, для которой ты подбирал значения.
Кстати, в указанный диапазон входит много больше символов, чем просто алфавит.
Таки зависимым? Примерчик можно?
Я ничего не подбирал.
1) \x80-\xFF - диапазон, которым все 8-битные кодировки и отличаются, т.е. большинство символов там - это символы кирилицы (для кодировок с кирилицей). Остальные символы в тексте встречаются очень и очень редко.
2) Шаблон отработает даже для utf-8.
3) В диапазон [а-я] не попадает ё почти во всех кодировках (если не во всех абсолютно). В koi-8 [а-я] не даст всех букв от а до я, т.к. алфавит начинается не с а. В случае с utf-8 картина будет совсем печальной.
См. выше.
Судя по твоему ответу, я не правильно понял задумку.
1) \x80-\xFF - диапазон, которым все 8-битные кодировки и отличаются, т.е. большинство символов там - это символы кирилицы (для кодировок с кирилицей). Остальные символы в тексте встречаются очень и очень редко.
2) Шаблон отработает даже для utf-8.
3) В диапазон [а-я] не попадает ё почти во всех кодировках (если не во всех абсолютно). В koi-8 [а-я] не даст всех букв от а до я, т.к. алфавит начинается не с а. В случае с utf-8 картина будет совсем печальной.
Задача была в отборе только русских букв, чтобы никаких лишних символов не было, а в диапазон \x80-\xFF входит, собственно, весь Юникод, включая кирилицу, арабский, армянский и прочие алфавиты, а так же руны, клинопись и кхмер, для которых и шрифтов толком не существует. Кто-то решит приколоться и будет тебе полная страничка кракозябров. Так-что [а-яё] (;)) надёжней (проверено!).
1) считываю html страницу в переменную -
$file = file_get_contents(...);
2) парсю её при помощи регулярок и результат заношу в таблицу -
$pattern = "#<div class=\"search-user-info\">(.*?)</div>#is";
while (preg_match_all($pattern, $file, $m))
{
for ($i=0; $i < count($m[0]); $i++)
{
preg_match("#<b>(.*?)</b>#is", $m[0][$i], $r);
preg_match("#Id=(.*?)&#is", $r[1], $id);
preg_match("#>(.*?)</a>#is", $r[1], $nick);
preg_match("#</a>, (.\d)#is", $r[1], $age);
mysql_query("INSERT INTO members VALUES ($id[1], '$nick[1]', $age[1])", $link);
}
...
}
3) распечатываю результат, где в столбце <nick> кириллица выводится как -
РЇСЃСЋРЅСЏ
Натали
њР°С€РµРЅСЊРєР°
Сначала грешил на мускул, но при записи кириллицы "напрямую", а не через preg_match, всё выглядит нормально. Также нормально выглядит вывод $file.
Пинайте сильнее, потому что я в php полное ламо)
Спасибо.
ЗЫ: капча в форме регистрации - издевательство.
Трансформация
$file = file_get_contents(...);
в
$file = iconv ('WINDOWS-1251', 'UTF-8', file_get_contents(...));
усугубила ситуацию. Раньше $file хоть выводилось "по-человечески" и парсилось. А вот после трансформации - не парсицо(
Кст, в заголовке страницы таки значицо "charset=UTF-8".