NvG Опубликовано 21 Июня 2005 Жалоба Поделиться Опубликовано 21 Июня 2005 Смотрим аттач.uluchshenie_post_parsera.txt Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Dekker Опубликовано 21 Июня 2005 Жалоба Поделиться Опубликовано 21 Июня 2005 в чем именно улучшение, пару слов для публики Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Vic'er Опубликовано 21 Июня 2005 Жалоба Поделиться Опубликовано 21 Июня 2005 ## Убираем while (preg_match(...)) ## Вообще, непонятно, зачем в парсере присутствуют такие нелепые конструкции типа ########################## КОД ########################## while( preg_match( "#\n?\[list\](.+?)\[/list\]\n?#ies" , $txt ) ) { $txt = preg_replace( "#\n?\[list\](.+?)\[/list\]\n?#ies", "\$this->regex_list('\\1')" , $txt ); } ######################################################### ибо здесь это абсолютно не нужно. Это не JavaScript и не Perl, где регулярные выражения без модификатора «g» заменяют только одно своё вхождение в тексте. ВЫВОД: убираем лишние while. Но preg_replace внутри них оставляем =) Иначе форум лишится некоторых тегов;-)NvG, помнится у меня как-то спрашивали, зачем я вместо одного preg_replace - делал while - мне тогда было лень отвечать, но в этот раз будем вскрывать подводные камни регекспов Пример: у нас есть список с двумя уровнями вложенности: [list] [*]item 1 [list] [*]item 1.1 [*]item 1.2 [/list] [*]item 2 [list] [*]item 2.1 [*]item 2.2 [/list] [*]item 3 [/list] при прогоне до последнего совпадения мы получаем корректный HTML: <ul> <li>item 1 <ul> <li>item 1.1</li> <li>item 1.2</li> </ul> </li> <li>item 2 <ul> <li>item 2.1</li> <li>item 2.2</li> </ul> </li> <li>item 3</li> </ul>, а вот теперь убираем цикл проходим один раз ))<ul><li>item 1 [list] </li><li>item 1.1 </li><li>item 1.2</li></ul>[*]item 2 <ul><li>item 2.1 </li><li>item 2.2</li></ul>[*]item 3 [/list] как можно заметить - разница таки есть зы Если уж изменять парсер списков, то нужно выстраивать дерево ## Парсить <b>, <u>, <i> несколькими регами не есть хорошо ## Ох… Ну зачем страдать этим: ########################## КОД ########################## // Start off with the easy stuff $txt = preg_replace( "#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $txt ); $txt = preg_replace( "#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $txt ); $txt = preg_replace( "#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $txt ); $txt = preg_replace( "#\[s\](.+?)\[/s\]#is", "<s>\\1</s>", $txt ); ######################################################### когда можно спокойно написать: ########################## КОД ########################## // Start off with the easy stuff $txt = preg_replace( "#\[(b|u|i)\](.+)\[/\\1\]#is", "<\\1>\\2</\\1>", $txt ); ######################################################### обратно парсить таким-же образом. P.S.: кстати, после этого неьзя ничего «намутить» с непра- вильной вложеностью тегов: [ b ]пр[ i ]оверка[ /b ][ /i ] отпарсит только теги [ b ] и [ /b ] тоже спорный вариант - я бы предложил таки оставить как есть... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 21 Июня 2005 Жалоба Поделиться Опубликовано 21 Июня 2005 я в парсере замечал чушь - #ies в preg_match уж думаю это никто не оспорит Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 21 Июня 2005 Жалоба Поделиться Опубликовано 21 Июня 2005 потом отпишусь Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Vic'er Опубликовано 22 Июня 2005 Жалоба Поделиться Опубликовано 22 Июня 2005 ...бойс.... давайте не рубить сгоряча??? Регэкспы эт скольская тема... и не всегда лутший вариант бывает самым лучшим Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
NvG Опубликовано 22 Июня 2005 Автор Жалоба Поделиться Опубликовано 22 Июня 2005 Пример: у нас есть список с двумя уровнями вложенности:ни разу не видел, чтобы юзали списки двойной вложенности Да большинство пользователей не умеют ими пользоваться Насчёт b, u, i: я просто не хочу, чтобы браузеры с валидаторами визжали, мол «ааа, некорректная вложеность тегов, иди ты нафиг, держи свою ошибку XML» я в парсере замечал чушь - #ies в preg_matchда модификатор /e — вообще чушь вот хочу переписать свой пост-парсер под preg_replace_callback… пару слов для публикиенто в процессе [1119444579:1119444935]Чёрт… оказывается, while можно убирать, но не у всех тегов…например, у quote, list, size — не стоит. У остальных — можно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 8 Августа 2005 Жалоба Поделиться Опубликовано 8 Августа 2005 Так что стоит производить это улучшение? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 10 Августа 2005 Жалоба Поделиться Опубликовано 10 Августа 2005 Я себе post_db_parse_bbcode вот так переписал. Вроде брешей не наделал //----------------------------------------- // Post DB parse BBCode //----------------------------------------- function post_db_parse_bbcode($t="") { global $ibforums, $DB, $std; if ( is_array( $ibforums->cache['bbcode'] ) and count( $ibforums->cache['bbcode'] ) ) { foreach( $ibforums->cache['bbcode'] as $i => $row ) { if ( $row['bbcode_useoption'] ) { $replace = str_replace( array("{option}","{content}"), array('\\1','\\2'), $row['bbcode_replace'] ); $t = preg_replace( "#\[".$row['bbcode_tag']."=(?:"|&\#39;)?(.+?)(?:"|&\#39;)?\](.+?)\[/".$row['bbcode_tag']."\]#si", $replace, $t ); } else { $replace = str_replace( "{content}", '\\1', $row['bbcode_replace'] ); $t = preg_replace( "#\[".$row['bbcode_tag']."\](.+?)\[/".$row['bbcode_tag']."\]#si", $replace, $t ); } } } return $t; }Сравните какой размер она имеет в оригинале Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 11 Августа 2005 Жалоба Поделиться Опубликовано 11 Августа 2005 вроде как бы и правильно все, но с множественными bb кодами вероятно могут быть проблемы, знать бы зачем Мэтт их парсилку отдельно написал... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 ## Парсить <b>, <u>, <i> несколькими регами не есть хорошо ## Ох… Ну зачем страдать этим: ########################## КОД ########################## // Start off with the easy stuff $txt = preg_replace( "#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $txt ); $txt = preg_replace( "#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $txt ); $txt = preg_replace( "#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $txt ); $txt = preg_replace( "#\[s\](.+?)\[/s\]#is", "<s>\\1</s>", $txt ); ######################################################### когда можно спокойно написать: ########################## КОД ########################## // Start off with the easy stuff $txt = preg_replace( "#\[(b|u|i)\](.+)\[/\\1\]#is", "<\\1>\\2</\\1>", $txt ); ######################################################### обратно парсить таким-же образом. P.S.: кстати, после этого неьзя ничего «намутить» с непра- вильной вложеностью тегов: [ b ]пр[ i ]оверка[ /b ][ /i ] отпарсит только теги [ b ] и [ /b ] А чем опастно использоваться вариант Vicer'а? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.