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 :: Кириллица, мульбитайтовые символы и preg_replace

 PHP.SU

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


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

> Без описания
Гагигегабо
Отправлено: 02 Декабря, 2012 - 17:46:30
Post Id



Новичок


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


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




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

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

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
Не на винде
Прикреплено изображение (Нажмите для увеличения)
utf8.png

(Отредактировано автором: 02 Декабря, 2012 - 18:08:33)

 
 Top
NoPaper
Отправлено: 02 Декабря, 2012 - 18:51:59
Post Id



Посетитель


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


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




Попробуй с mb_ereg_replace
PHP:
скопировать код в буфер обмена
  1.  
  2. echo '<p>На вход подается паттерн в utf8 и строка поиска в utf8 </p>';
  3. echo  '<br /> '.mb_ereg_replace($pattern_utf8, "", $search);  
  4.  
 
 Top
Гагигегабо
Отправлено: 02 Декабря, 2012 - 19:09:37
Post Id



Новичок


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


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




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);
 
 Top
NoPaper
Отправлено: 02 Декабря, 2012 - 19:14:37
Post Id



Посетитель


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


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




Сейчас у себя запустил скрипт:
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

(Отредактировано автором: 02 Декабря, 2012 - 19:17:34)

 
 Top
Гагигегабо
Отправлено: 02 Декабря, 2012 - 19:19:15
Post Id



Новичок


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


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




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:22:25)

 
 Top
sKaa
Отправлено: 02 Декабря, 2012 - 19:24:07
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


PHP:
скопировать код в буфер обмена
  1. echo preg_replace('/[a-zA-Z0-9А-Яа-я]/iu', '', "Проверка работы кодировки ¦ UTF-8 ¦");

(Добавление)
[^ ... Ваш шаблон исключает обработку указанных далее символов.
 
 Top
Гагигегабо
Отправлено: 02 Декабря, 2012 - 19:31:33
Post Id



Новичок


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


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




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);
 
 Top
sKaa
Отправлено: 02 Декабря, 2012 - 19:34:30
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


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



Новичок


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


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




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


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

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


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2013  


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




почему-то корявит большую букву Р (кирилица)

пример: пРивет Родина
результат: п� ивет � одина
 
 Top
LIME
Отправлено: 02 Апреля, 2013 - 08:01:31
Post Id


Активный участник


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


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




а у меня сегодня чето в боку стреляет
это все наверное от перемены погоды
(Добавление)
вопрос где?
код где?
почему в чужой теме?
 
 Top
Bkm
Отправлено: 02 Апреля, 2013 - 08:07:44
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2013  


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




вопрос где?

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

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


код где?

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


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

смысл новую тему открывать?
 
 Top
LIME
Отправлено: 02 Апреля, 2013 - 08:11:13
Post Id


Активный участник


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


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




а у тебя текст в utf8?
 
 Top
Bkm
Отправлено: 02 Апреля, 2013 - 08:13:50
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2013  


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




страница точно в utf8, файл тоже, проблем не замечал пока случайно большую букву Р в строку не вписал.

дополнение

файл в utf8 без BOM

(Отредактировано автором: 02 Апреля, 2013 - 08:15:29)

 
 Top
LIME
Отправлено: 02 Апреля, 2013 - 08:22:34
Post Id


Активный участник


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


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




у меня с твоим примером нет проблем
скопипасть кусок реального текста
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Кодировки и все смежное »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB