PHP.SU

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

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

> Найдено сообщений: 5
Гагигегабо Отправлено: 02 Декабря, 2012 - 19:40:03 • Тема: Кириллица, мульбитайтовые символы и preg_replace • Форум: Кодировки и все смежное

Ответов: 18
Просмотров: 12596
sKaa пишет:
Гагигегабо, пробел в шаблоне можно обозначить как :
PHP:
скопировать код в буфер обмена
  1.     echo preg_replace('/[^\sa-zA-Z0-9А-Яа-яЁё]/iu', '', $search);


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

\s - соответствует любому из "пробельных символов" (пробел, вертикальная , или горизонтальная табуляция, символ новой строки и т. д.),
Гагигегабо Отправлено: 02 Декабря, 2012 - 19:31:33 • Тема: Кириллица, мульбитайтовые символы и preg_replace • Форум: Кодировки и все смежное

Ответов: 18
Просмотров: 12596
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);
Гагигегабо Отправлено: 02 Декабря, 2012 - 19:19:15 • Тема: Кириллица, мульбитайтовые символы и preg_replace • Форум: Кодировки и все смежное

Ответов: 18
Просмотров: 12596
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.  );

Работает также, как и я писал выше.
Гагигегабо Отправлено: 02 Декабря, 2012 - 19:09:37 • Тема: Кириллица, мульбитайтовые символы и preg_replace • Форум: Кодировки и все смежное

Ответов: 18
Просмотров: 12596
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);
Гагигегабо Отправлено: 02 Декабря, 2012 - 17:46:30 • Тема: Кириллица, мульбитайтовые символы и preg_replace • Форум: Кодировки и все смежное

Ответов: 18
Просмотров: 12596
В общем не получается отфильтровать строку с символами вроде ¦, ¦ и кириллицей.

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

http://goo[dot]gl/UBRmQ

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

Паттерн:

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


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

Паттерн:

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


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

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

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


Паттерн:


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



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

Собственно, это не всё.
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
Не на винде

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB