Доброго времени суток всем!
Мой скрипт работает со строками в UTF-8, работает корректно. Но появилась необходимость использовать регулярные выражения для работы с русским текстом (вырезать из строки только русские слова и отдавать их в функцию для обработки), сделал это так:
$Text = preg_replace_callback("#[а-я]+#i", "MyFun", $Text);
В функцию приходят обломки слов и знаки вопроса, причём некоторые слова ломаются на несколько частей, например, первый вызов MyFun - вопросик (обозначающий первую букву слова), следующий - две буквы (2я и 3я) и вопросик, потом - ещё вопросик и шестая буква.
Пробовал перед вызовом preg_replace_callback вставить
$Str = iconv("UTF-8", "CP1251", $Str);
а первой строкой MyFun раскодировать обратно в Юникод:
$Matches[0] = iconv("CP1251", "UTF-8", $Matches[0]);
Почему-то работает не всегда. Строку "ААА ББББ ВВВВВ ГГГГГГ" обрабатывает корректно, то же самое маленькими буквами - нет. "Съешь ещё этих мягких французских булок, да выпей чаю" не понимает даже большие буквы.
Я в растерянности. Нет ли какого-то способа использовать регулярные выражения с Юникодом и русским языком? Или хотя бы переводить в другую кодировку на время работы с регэкспами и потом обратно?
Заранее спасибо.
1. bugmenot - 15 Ноября, 2007 - 13:01:02 - перейти к сообщению
2. evgenijj - 15 Ноября, 2007 - 13:10:14 - перейти к сообщению
Функции рег. выражений некорректно работают со строками UTF-8
http://www.phpwact[dot]org/php/i18n/utf-8
Надо использовать функции
http://ru2.php.net/mb_string
В 6-ой версии PHP разработчики обещают устранить эту проблему
P.S. Это относится не только к функциям рег.выражений, но и ко многим функциям работы со строками
http://www.phpwact[dot]org/php/i18n/utf-8
Надо использовать функции
http://ru2.php.net/mb_string
В 6-ой версии PHP разработчики обещают устранить эту проблему
P.S. Это относится не только к функциям рег.выражений, но и ко многим функциям работы со строками
3. Джур - 15 Ноября, 2007 - 13:13:55 - перейти к сообщению
для POSIX подобных я встречал вот такую чушку "mb_ereg_match()" возможно это то что вам надо...
iconv - замените на самописную функцию, например на
iconv - замените на самописную функцию, например на
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- '194171'=>chr(171),
- '194187'=>chr(187),
- '194176'=>chr(176),
- # upper case letters
- # lower case letters
- );
- function utf2win($str)
- {
- global $chars;
- $temp = '';
- for($i=0;$i<$len;$i++) {
- while($i<$len-1 && $chcode!=208 && $chcode!=209 && $chcode!=194) { # skip not utf8 chars
- $temp.=$str[$i];
- }
- if($i<$len-1) {
- $temp.= $chars[$key];
- } else $temp.=$str[$i];
- } else $temp.=$str[$i];
- }
- return($temp);
- }
- function win2utf($str)
- {
- global $chars;
- $temp = '';
- for($i=0;$i<$len;$i++) {
- $key = (string) $chars[$str[$i]];
- $temp.=$chs;
- } else $temp.=$str[$i];
- }
- return($temp);
- }