Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Регулярные выражения и UTF-8

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
bugmenot
Отправлено: 15 Ноября, 2007 - 13:01:02
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Нояб. 2007  


Помог: 0 раз(а)




Доброго времени суток всем!

Мой скрипт работает со строками в 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]);

Почему-то работает не всегда. Строку "ААА ББББ ВВВВВ ГГГГГГ" обрабатывает корректно, то же самое маленькими буквами - нет. "Съешь ещё этих мягких французских булок, да выпей чаю" не понимает даже большие буквы.

Я в растерянности. Нет ли какого-то способа использовать регулярные выражения с Юникодом и русским языком? Или хотя бы переводить в другую кодировку на время работы с регэкспами и потом обратно?

Заранее спасибо.
 
 Top
evgenijj
Отправлено: 15 Ноября, 2007 - 13:10:14
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Функции рег. выражений некорректно работают со строками UTF-8
http://www.phpwact[dot]org/php/i18n/utf-8
Надо использовать функции
http://ru2.php.net/mb_string
В 6-ой версии PHP разработчики обещают устранить эту проблему

P.S. Это относится не только к функциям рег.выражений, но и ко многим функциям работы со строками
 
 Top
Джур
Отправлено: 15 Ноября, 2007 - 13:13:55
Post Id



Посетитель


Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007  


Помог: 0 раз(а)




для POSIX подобных я встречал вот такую чушку "mb_ereg_match()" возможно это то что вам надо...
iconv - замените на самописную функцию, например на
PHP:
скопировать код в буфер обмена
  1.  
  2. $chars = array(
  3.         '194171'=>chr(171),
  4.         '194187'=>chr(187),
  5.         '194176'=>chr(176),
  6.   # upper case letters
  7.  '208144' => chr(192), '208145' => chr(193), '208146' => chr(194),
  8.   '208147' => chr(195), '208148' => chr(196), '208149' => chr(197),
  9.   '208129' => chr(168), '208150' => chr(198), '208151' => chr(199),
  10.   '208152' => chr(200), '208153' => chr(201), '208154' => chr(202),
  11.   '208155' => chr(203), '208156' => chr(204), '208157' => chr(205),
  12.   '208158' => chr(206), '208159' => chr(207), '208160' => chr(208),
  13.   '208161' => chr(209), '208162' => chr(210), '208163' => chr(211),
  14.   '208164' => chr(212), '208165' => chr(213), '208166' => chr(214),
  15.   '208167' => chr(215), '208168' => chr(216), '208169' => chr(217),
  16.   '208170' => chr(218), '208171' => chr(219), '208172' => chr(220),
  17.   '208173' => chr(221), '208174' => chr(222), '208175' => chr(223),
  18.   # lower case letters
  19.  '208176' => chr(224), '208177' => chr(225), '208178' => chr(226),
  20.   '208179' => chr(227), '208180' => chr(228), '208181' => chr(229),
  21.   '209145' => chr(184), '208182' => chr(230), '208183' => chr(231),
  22.   '208184' => chr(232), '208185' => chr(233), '208186' => chr(234),
  23.   '208187' => chr(235), '208188' => chr(236), '208189' => chr(237),
  24.   '208190' => chr(238), '208191' => chr(239), '209128' => chr(240),
  25.   '209129' => chr(241), '209130' => chr(242), '209131' => chr(243),
  26.   '209132' => chr(244), '209133' => chr(245), '209134' => chr(246),
  27.   '209135' => chr(247), '209136' => chr(248), '209137' => chr(249),
  28.   '209138' => chr(250), '209139' => chr(251), '209140' => chr(252),
  29.   '209141' => chr(253), '209142' => chr(254), '209143' => chr(255)
  30. );
  31.  
  32. function utf2win($str)
  33. {
  34.   global $chars;
  35.   $len = strlen($str);
  36.   $temp = '';
  37.  
  38.   for($i=0;$i<$len;$i++) {
  39.     $chcode = ord($str[$i]);
  40.     while($i<$len-1 && $chcode!=208 && $chcode!=209 && $chcode!=194) { # skip not utf8 chars
  41.      $temp.=$str[$i];
  42.       $chcode = ord($str[++$i]);
  43.     }
  44.     if($i<$len-1) {
  45.       $key = (string) $chcode.ord($str[++$i]);
  46.       if(isset($chars[$key])) { # if after 208 or 209 correct char (exist as key in $chars)
  47.         $temp.= $chars[$key];
  48.       } else $temp.=$str[$i];
  49.     } else $temp.=$str[$i];
  50.   }
  51.   return($temp);
  52. }
  53.  
  54. function win2utf($str)
  55. {
  56.   global $chars;
  57.   $chars = array_flip($chars);
  58.   $len = strlen($str);
  59.   $temp = '';
  60.  
  61.   for($i=0;$i<$len;$i++) {
  62.     if(isset($chars[$str[$i]])) {
  63.     $key = (string) $chars[$str[$i]];
  64.     $chs = chr($key[0].$key[1].$key[2]).chr($key[3].$key[4].$key[5]);
  65.     $temp.=$chs;
  66.     } else $temp.=$str[$i];
  67.   }
  68.   $chars = array_flip($chars);
  69.   return($temp);
  70. }
  71.  


-----
Тамбовский каджит тебе товарищ
 
 Top
bugmenot
Отправлено: 15 Ноября, 2007 - 22:14:33
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Нояб. 2007  


Помог: 0 раз(а)




Цитата:
Функции рег. выражений некорректно работают со строками UTF-8
http://www.phpwact[dot]org/php/i18n/utf-8
Прочитал по ссылке о модификаторе u, если его использовать, то всё отлично работает. Огромное спасибо! К сожалению, я плохо знаю английский язык... С ним связаны какие-то проблемы?

Цитата:
iconv - замените на самописную функцию, например на <Код...>
Эти функции не хотели конвертировать буквы от т до я. Причём я нашёл в Сети ещё одну замену iconv() ( http://www[dot]openproj[dot]ru/21/1162/ ), и она тоже не конвертировала эти же буквы. Но, в любом случае, проблема решена. Благодарю за помощь!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB