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 :: Версия для печати :: Multibyte preg_filter
Форумы портала PHP.SU » PHP » Регулярные выражения » Multibyte preg_filter

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

1. Viper - 26 Июля, 2010 - 16:02:18 - перейти к сообщению
Есть текст вида

CODE (htmlphp):
скопировать код в буфер обмена
  1. {en}Hello world!{/en}
  2. {ru}Привет мир!{/ru}


NB! Перевод строки может быть и \r\n\ и \n и \r

PHP:
скопировать код в буфер обмена
  1. $name = preg_filter('/\{en\}(.*)\{\/en\}/s', '\\1', $data);

возвращает
CODE (htmlphp):
скопировать код в буфер обмена
  1. Hello world!
  2. {ru}Привет мир!{/ru}


Есть ли решение?
2. Мелкий - 26 Июля, 2010 - 16:10:26 - перейти к сообщению
а добавление модификатора m (многострочный поиск) не поможет?
3. Viper - 26 Июля, 2010 - 16:19:09 - перейти к сообщению
Мелкий пишет:
а добавление модификатора m (многострочный поиск) не поможет?

не помогло. добавил im модификаторы, а получил просто "e"
4. Champion - 26 Июля, 2010 - 17:50:53 - перейти к сообщению
Viper пишет:
Есть ли решение?
Возможно, есть. Но только скажи, что получиться должно. Функция-то как надо, так и сработала.
5. Viper - 27 Июля, 2010 - 07:40:59 - перейти к сообщению
Champion должно получится просто "Hello world!"... ну в теории Улыбка
6. JustUserR - 30 Июля, 2010 - 15:08:17 - перейти к сообщению
Viper пишет:
Есть ли решение?
Все строковые функции и регулярные выражения достаточно сильно зависят от кодировки в которой трактуются данные из их внутреннего представления - по этой причине при работе с нми необходимо не только проверить чтобы строковая константа шаблона и сама проверяемая строка были в одной и той же кодировки - но и функция регулярных выражений также трактовала их в заданной правильной кодировке
Для решения вы можете попробовать несколько вариантов - например с помощью функций mb_convert_encoding или iconv преобразовать строку в однобайтовый вид и производить обычное сравнение - или же воспользовать функций http://www.php.su/functions/?mb-regex-encoding для указания кодировки в которой будут трактоваться шаблоны регулярных выраженй Также можете попробовать добавить модификатор /u к соответствующему шаблону
7. Champion - 30 Июля, 2010 - 19:15:48 - перейти к сообщению
Чтоб из этой строки получить
Viper пишет:
Hello world
, можно preg_match(/\{en\}(.*)\{\/en\}/s, $str, $m) и поискать его в $m;

Прег-фильтр - он всё-таки как реплейс, но с маленьким отличием.
(Добавление)
Можно, может быть, и так
reg_filter('/$.+\{en\}(.*)\{\/en\}.+$/s', '\\1', $data); Но думаю, цель была не та)
8. JustUserR - 31 Июля, 2010 - 02:44:27 - перейти к сообщению
Champion пишет:
Прег-фильтр - он всё-таки как реплейс, но с маленьким отличием.
Судя по приведенному результату выполнения фильтрации текста в строке - функция preg_filter вообще проигнорировала текста находящийся в русской кодировке Как самый простой вариант проверки можно сохранить исходный код PHP-скрипта в однобайтовой кодировке windows-1251 - а также установить ее же для внутреннего представления данных и для строки по которой осуществляется шаблонная фильтрация
9. Champion - 31 Июля, 2010 - 08:27:36 - перейти к сообщению
JustUserR, судя по приведенному результату, он и отработал как preg_replace
10. JustUserR - 31 Июля, 2010 - 16:12:59 - перейти к сообщению
Champion пишет:
JustUserR, судя по приведенному результату, он и отработал как preg_replace
В таком случае можно воспользоваться дополнительной функией обратного вызова - которая будет обрабатывать одну или все найденные замену и сохранять ее в заданную переменную - полученный результат по сути и будет искомой фильтрацией строки по найденным вхождениям по шаблону
11. Champion - 31 Июля, 2010 - 16:24:36 - перейти к сообщению
Чего?? preg_match можно воспользоваться и всё.
12. JustUserR - 31 Июля, 2010 - 18:04:03 - перейти к сообщению
Champion пишет:
Чего?? preg_match можно воспользоваться и всё.
Имелось в виду что если в функцию обратного вызова передавать аргумент по ссылке - то можно сразу модифицировать исходную строку и оставить в ней только нужные данные согласно шаблону фильтрации
13. Viper - 02 Августа, 2010 - 09:08:15 - перейти к сообщению
Почитал, подумал, попробовал... сделал на _match ;)
14. JustUserR - 03 Августа, 2010 - 03:16:46 - перейти к сообщению
Viper пишет:
Почитал, подумал, попробовал... сделал на _match ;)
Вообще если структура анализируемого текста у вас в точности такая же как в приведенном вами сообщении - то можно сделать разбор на основе обычных строковых функций типа substr и strpos - учитывая что нужно искать только два вхожденя соответствующие искомому языку и располагаемые последовательно без идентичных вложенных тегов - то такой подход будет работать даже быстрее
15. Viper - 04 Августа, 2010 - 08:05:49 - перейти к сообщению
JustUserR пишет:
учитывая что нужно искать только два вхожденя соответствующие искомому языку и располагаемые последовательно без идентичных вложенных тегов - то такой подход будет работать даже быстрее

да вот в том то и дело что кол-во тэгов языка может быть n и заранее не известно. просто не вижу другого выхода создания многоязыкового контента без создания сотен полей для каждого языка. на страницу в около 5 preg_match'ей будет.

 

Powered by ExBB FM 1.0 RC1