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
Форумы портала PHP.SU :: Версия для печати :: Кириллица, мульбитайтовые символы и preg_replace
Форумы портала PHP.SU » » Кодировки и все смежное » Кириллица, мульбитайтовые символы и preg_replace

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

1. Гагигегабо - 02 Декабря, 2012 - 17:46:30 - перейти к сообщению
В общем не получается отфильтровать строку с символами вроде ¦, ¦ и кириллицей.

Где ¦ - это, например, мнемоники:

http://goo[dot]gl/UBRmQ

тут они не отображаются, так как форум на cp-1251.

Паттерн:

PHP:
скопировать код в буфер обмена
  1. /[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/i


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

Паттерн:

PHP:
скопировать код в буфер обмена
  1. /[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/iu


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

Паттерны c \w выводят какую-то херь (:

Если смениль локаль на


Паттерн:
PHP:
скопировать код в буфер обмена
  1.  
  2. /[^ \w\-]*/i


отфильтрует и кириллицу и мультибайтовые символы.

PHP:
скопировать код в буфер обмена
  1. /[^ \w\-]*/iu


также выведет херь.

Собственно, это не всё.
iconv обрезает при перекодирование в 'utf-8' -> 'windows-1251' по мультибайтовому символу, что ещё трагичней, так как перевести строку в windows-1251 и провести её очистку а затем перегнать обратно в
utf-8 не получиться.


Вот извратный скрипт, который я написал для проверки (кодировка скрипта в utf-8):
PHP:
скопировать код в буфер обмена
  1.  
  2. header('Content-Type: text/html; charset=utf-8');
  3. //setlocale(LC_ALL, 'ru_RU.UTF-8');
  4. setlocale(LC_ALL, 'ru_RU.CP1251');
  5.  
  6. echo '<p>Cтрока поиска в UTF-8</p>';
  7. echo $search = "Проверка работы кодировки ¦ UTF-8 ¦";
  8. echo '<p>Cтрока поиска в windows-1251</p>';
  9. echo $search_ansi = iconv('utf-8'  ,  'windows-1251', $search);
  10. echo '<br /><br />';
  11.  
  12. $pattern_ansi = iconv('utf-8'  ,  'windows-1251', "/[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/i");
  13. $pattern_ansi_u = iconv('utf-8'  ,  'windows-1251', "/[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/iu");
  14. $pattern_utf8 = "/[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/i";
  15. $pattern_utf8_u = "/[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/iu";
  16. $pattern = "/[^ \w\-]*/i";
  17. $pattern_u = "/[^ \w\-]*/iu";
  18.  
  19. echo '<p>На вход подается паттерн в windows-1251 и строка поиска в UTF-8</p>';
  20. echo  '<br />1) '.preg_replace($pattern_ansi, "",  $search);
  21. echo '<p>На вход подается паттерн в windows-1251 и строка поиска в UTF-8 (модификатор /u)</p>';  
  22. echo  '<br />2) '.preg_replace($pattern_ansi_u, "",  $search);  
  23.  
  24. echo '<p>На вход подается паттерн в windows-1251 и строка поиска в windows-1251</p>';
  25. echo  '<br />3) '.preg_replace($pattern_ansi, "",  $search_ansi);  
  26. echo '<p>На вход подается паттерн в windows-1251 и строка поиска в windows-1251 (модификатор /u)</p>';
  27. echo  '<br />4) '.preg_replace($pattern_ansi_u, "",  $search_ansi);  
  28.  
  29.  
  30. echo '<p>На вход подается паттерн в utf8 и строка поиска в utf8 </p>';
  31. echo  '<br />5) '.preg_replace($pattern_utf8, "", $search);  
  32. echo '<p>На вход подается паттерн в utf8 и строка поиска в utf8 (модификатор /u)</p>';
  33. echo  '<br />6) '.preg_replace($pattern_utf8_u, "", $search);
  34.  
  35. echo '<p>На вход подается паттерн в utf8 и строка поиска в windows-1251 </p>';
  36. echo  '<br />7) '.preg_replace($pattern_utf8, "", $search_ansi);
  37. echo '<p>На вход подается паттерн в utf8 и строка поиска в windows-1251 (модификатор /u)</p>';  
  38. echo  '<br />8) '.preg_replace($pattern_utf8_u, "", $search_ansi);
  39.  
  40.  
  41. echo '<p>На вход подается паттерн и строка поиска в utf-8 </p>';
  42. echo  '<br />9) '.preg_replace($pattern, "",   $search);
  43. echo '<p>На вход подается паттерн и строка поиска в utf-8 (модификатор /u)</p>';
  44. echo  '<br />10) '.preg_replace($pattern_u, "",  $search);
  45.  
  46. echo '<p>На вход подается паттерн и строка поиска в windows-1251 </p>';  
  47. echo  '<br />11) '.preg_replace($pattern, "",  $search_ansi);
  48. echo '<p>На вход подается паттерн и строка поиска в windows-1251 (модификатор /u)</p>';  
  49. echo  '<br />12) '.preg_replace($pattern_u, "",  $search_ansi);


То, что выводится сразу в utf8:
https://dl[dot]dropbox[dot]com/u/18352137/temp/utf8[dot]png

Если сменить кодировку в браузере на windows-1251:
https://dl[dot]dropbox[dot]com/u/18352137/temp/ansi[dot]png

PHP Version 5.3.13
Multibyte regex (oniguruma) version 4.7.1
Не на винде
2. NoPaper - 02 Декабря, 2012 - 18:51:59 - перейти к сообщению
Попробуй с mb_ereg_replace
PHP:
скопировать код в буфер обмена
  1.  
  2. echo '<p>На вход подается паттерн в utf8 и строка поиска в utf8 </p>';
  3. echo  '<br /> '.mb_ereg_replace($pattern_utf8, "", $search);  
  4.  
3. Гагигегабо - 02 Декабря, 2012 - 19:09:37 - перейти к сообщению
NoPaper пишет:
Попробуй с mb_ereg_replace
PHP:
скопировать код в буфер обмена
  1.  
  2. echo '<p>На вход подается паттерн в utf8 и строка поиска в utf8 </p>';
  3. echo  '<br /> '.mb_ereg_replace($pattern_utf8, "", $search);  
  4.  


Результат аналогичен использованию preg_replace с модификатором /u

PHP:
скопировать код в буфер обмена
  1. echo  '<br />6) '.preg_replace($pattern_utf8_u, "", $search);
4. NoPaper - 02 Декабря, 2012 - 19:14:37 - перейти к сообщению
Сейчас у себя запустил скрипт:
PHP:
скопировать код в буфер обмена
  1. <?
  2. header('Content-Type: text/html; charset=utf-8');
  3. echo mb_ereg_replace('/[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/i', "", "Проверка работы кодировки ¦ UTF-8 ¦");


Все работает отлично!

Файл в кодировке UTF-8 + в корне лежит htaccess с прописанной кодировкой utf-8
5. Гагигегабо - 02 Декабря, 2012 - 19:19:15 - перейти к сообщению
NoPaper пишет:
Сейчас у себя запустил скрипт:
PHP:
скопировать код в буфер обмена
  1. <?
  2. header('Content-Type: text/html; charset=utf-8');
  3. echo mb_ereg_replace('/[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*/i', "", "Проверка работы кодировки ¦ UTF-8 ¦");


Все работает отлично!

Файл в кодировке UTF-8 + в корне лежит htaccess с прописанной кодировкой utf-8


Этот код ничего не фильтрует, я думаю имелось ввиду следующее:

PHP:
скопировать код в буфер обмена
  1.         '[^ a-zA-Z0-9\+абвгдеёжзийклмнопрстуфчхцшщъьыэюяАБВГДЕЁЖЗИЧЙКЛМНОПРСТУФХЦШЩЬЪЫЭЮЯ\-]*',
  2.         "",
  3.         "Проверка работы кодировки ¦ UTF-8 ¦"
  4.  );

Работает также, как и я писал выше.
6. sKaa - 02 Декабря, 2012 - 19:24:07 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. echo preg_replace('/[a-zA-Z0-9А-Яа-я]/iu', '', "Проверка работы кодировки ¦ UTF-8 ¦");

(Добавление)
[^ ... Ваш шаблон исключает обработку указанных далее символов.
7. Гагигегабо - 02 Декабря, 2012 - 19:31:33 - перейти к сообщению
sKaa пишет:
PHP:
скопировать код в буфер обмена
  1. echo preg_replace('/[a-zA-Z0-9А-Яа-я]/iu', '', "Проверка работы кодировки ¦ UTF-8 ¦");

(Добавление)
[^ ... Ваш шаблон исключает обработку указанных далее символов.


Супер, спасибо =))) Вот, что значит свежий взгляд.

Даже не верится, надо потестировать.

Так корректнее:

CODE (htmlphp):
скопировать код в буфер обмена
  1. echo preg_replace('/[^ a-zA-Z0-9А-Яа-яЁё]/iu', '', $search);
8. sKaa - 02 Декабря, 2012 - 19:34:30 - перейти к сообщению
Гагигегабо, пробел в шаблоне можно обозначить как :
PHP:
скопировать код в буфер обмена
  1.     echo preg_replace('/[^\sa-zA-Z0-9А-Яа-яЁё]/iu', '', $search);
9. Гагигегабо - 02 Декабря, 2012 - 19:40:03 - перейти к сообщению
sKaa пишет:
Гагигегабо, пробел в шаблоне можно обозначить как :
PHP:
скопировать код в буфер обмена
  1.     echo preg_replace('/[^\sa-zA-Z0-9А-Яа-яЁё]/iu', '', $search);


Спасибо за совет, но мне нужен просто пробел.

\s - соответствует любому из "пробельных символов" (пробел, вертикальная , или горизонтальная табуляция, символ новой строки и т. д.),
10. Bkm - 02 Апреля, 2013 - 07:54:55 - перейти к сообщению
почему-то корявит большую букву Р (кирилица)

пример: пРивет Родина
результат: п� ивет � одина
11. LIME - 02 Апреля, 2013 - 08:01:31 - перейти к сообщению
а у меня сегодня чето в боку стреляет
это все наверное от перемены погоды
(Добавление)
вопрос где?
код где?
почему в чужой теме?
12. Bkm - 02 Апреля, 2013 - 08:07:44 - перейти к сообщению
вопрос где?

в посте выше написано

PHP:
скопировать код в буфер обмена
  1. preg_replace('/[^\sa-zA-Z0-9А-Яа-яЁё]/iu', '', $search);


код где?

PHP:
скопировать код в буфер обмена
  1. preg_replace('/[^\sa-zA-Z0-9А-Яа-яЁё]/iu', '', $search);


почему в чужой теме?

смысл новую тему открывать?
13. LIME - 02 Апреля, 2013 - 08:11:13 - перейти к сообщению
а у тебя текст в utf8?
14. Bkm - 02 Апреля, 2013 - 08:13:50 - перейти к сообщению
страница точно в utf8, файл тоже, проблем не замечал пока случайно большую букву Р в строку не вписал.

дополнение

файл в utf8 без BOM
15. LIME - 02 Апреля, 2013 - 08:22:34 - перейти к сообщению
у меня с твоим примером нет проблем
скопипасть кусок реального текста

 

Powered by ExBB FM 1.0 RC1