Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

preg_match и русские буковы

333
24 марта 2008 года
GHopper
200 / / 28.12.2004
Здравствуйте!
Старый баян про кодировку 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? Если да, то что для этого нужно?
12
24 марта 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: GHopper

Возможно-ли использовать дедовский паттерн (\w+) для работы со строками в UTF-8? Если да, то что для этого нужно?


 
Код:
preg_match_all("/[а-я]+/u", 'one два three', $matches);
333
24 марта 2008 года
GHopper
200 / / 28.12.2004
получается, что вместо "\w" нужно писать "(?i)[a-zа-я]+". А как заставить "\w" работать в данных условиях? Есть такая возможность?
12
24 марта 2008 года
alekciy
3.0K / / 13.12.2005
Видимо нет. Будем надеятся на 6-ку. Если конечно в ней не убъют удею юникода как в перле (читать "Нормализация и уроды" :D ).

http://www.onphp5.com/article/22
1.8K
24 марта 2008 года
Валериус
190 / / 14.07.2006
Цитата: alekciy
 
Код:
preg_match_all("/[а-я]+/u", 'one два three', $matches);


Ага, что-то лучше сложно придумать, я на том же остановился. Разве что [a-zA-Zа-яА-Я] запихнуть в переменную и её вставлять в шаблон, но это те же яйца.

333
24 марта 2008 года
GHopper
200 / / 28.12.2004
а где прочитать по поводу \pL? что это за штука такая?
12
24 марта 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: Валериус
Ага, что-то лучше сложно придумать, я на том же остановился. Разве что [a-zA-Zа-яА-Я] запихнуть в переменную и её вставлять в шаблон, но это те же яйца.


Вообще то есть флаг i ;)
/[a-zа-я]+/ui

12
24 марта 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: GHopper
а где прочитать по поводу \pL? что это за штука такая?


А фиг знает....

353
25 марта 2008 года
Nixus
840 / / 04.01.2007
По-моему, лучше использовать /([a-z\x80-\xFF]+)/i, что делает скрипт менее зависимым от кодировки.
1.8K
25 марта 2008 года
Валериус
190 / / 14.07.2006
Цитата: Nixus
По-моему, лучше использовать /([a-z\x80-\xFF]+)/i, что делает скрипт менее зависимым от кодировки.


Это делает его по-другому зависимым от кодировки :) Если написать а-я, то он будет проверять в той кодировке, в которой сохранён сам, а если \x80-\xFF, то в той, для которой ты подбирал значения.

Кстати, в указанный диапазон входит много больше символов, чем просто алфавит.

12
25 марта 2008 года
alekciy
3.0K / / 13.12.2005
Но мы то говорим только о UTF-8 кодировке. Можно вообще всю кирилическую собрать:
http://alanwood.net/unicode/cyrillic.html
353
25 марта 2008 года
Nixus
840 / / 04.01.2007
Цитата: Валериус
Это делает его по-другому зависимым от кодировки :)


Таки зависимым? Примерчик можно?

Цитата: Валериус
Если написать а-я, то он будет проверять в той кодировке, в которой сохранён сам, а если \x80-\xFF, то в той, для которой ты подбирал значения.


Я ничего не подбирал.
1) \x80-\xFF - диапазон, которым все 8-битные кодировки и отличаются, т.е. большинство символов там - это символы кирилицы (для кодировок с кирилицей). Остальные символы в тексте встречаются очень и очень редко.
2) Шаблон отработает даже для utf-8.
3) В диапазон [а-я] не попадает ё почти во всех кодировках (если не во всех абсолютно). В koi-8 [а-я] не даст всех букв от а до я, т.к. алфавит начинается не с а. В случае с utf-8 картина будет совсем печальной.

Цитата: Валериус
Кстати, в указанный диапазон входит много больше символов, чем просто алфавит.


См. выше.

1.8K
27 марта 2008 года
Валериус
190 / / 14.07.2006
Цитата: Nixus
Таки зависимым? Примерчик можно?


Судя по твоему ответу, я не правильно понял задумку.

Цитата: Nixus

1) \x80-\xFF - диапазон, которым все 8-битные кодировки и отличаются, т.е. большинство символов там - это символы кирилицы (для кодировок с кирилицей). Остальные символы в тексте встречаются очень и очень редко.
2) Шаблон отработает даже для utf-8.
3) В диапазон [а-я] не попадает ё почти во всех кодировках (если не во всех абсолютно). В koi-8 [а-я] не даст всех букв от а до я, т.к. алфавит начинается не с а. В случае с utf-8 картина будет совсем печальной.


Задача была в отборе только русских букв, чтобы никаких лишних символов не было, а в диапазон \x80-\xFF входит, собственно, весь Юникод, включая кирилицу, арабский, армянский и прочие алфавиты, а так же руны, клинопись и кхмер, для которых и шрифтов толком не существует. Кто-то решит приколоться и будет тебе полная страничка кракозябров. Так-что [а-яё] (;)) надёжней (проверено!).

63K
02 августа 2010 года
Кузнецофф
2 / / 02.08.2010
Здрасьте. Извините за глупости. У мя тоже проблема "кириллица и регулярки":
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 полное ламо)
Спасибо.
ЗЫ: капча в форме регистрации - издевательство.
52K
02 августа 2010 года
arvitaly
4 / / 01.10.2009
Скорее всего сайт который ты получаешь file_get_contents не в кириллице, используй iconv
63K
02 августа 2010 года
Кузнецофф
2 / / 02.08.2010
Цитата: arvitaly
Скорее всего сайт который ты получаешь file_get_contents не в кириллице, используй iconv



Трансформация
$file = file_get_contents(...);
в
$file = iconv ('WINDOWS-1251', 'UTF-8', file_get_contents(...));
усугубила ситуацию. Раньше $file хоть выводилось "по-человечески" и парсилось. А вот после трансформации - не парсицо(
Кст, в заголовке страницы таки значицо "charset=UTF-8".

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог