Перейти к контенту

Улучшение post_parser.php


Рекомендуемые сообщения

## Убираем 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]

:D как можно заметить - разница таки есть :)

 

зы Если уж изменять парсер списков, то нужно выстраивать дерево ;)

 

 

 

## Парсить <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 ]

тоже спорный вариант :) - я бы предложил таки оставить как есть...
Ссылка на комментарий
Поделиться на других сайтах

я в парсере замечал чушь - #ies в preg_match :D

уж думаю это никто не оспорит ;)

Ссылка на комментарий
Поделиться на других сайтах

...бойс.... давайте не рубить сгоряча??? Регэкспы эт скольская тема... и не всегда лутший вариант бывает самым лучшим ;):D
Ссылка на комментарий
Поделиться на других сайтах

Пример: у нас есть список с двумя уровнями вложенности:
ни разу не видел, чтобы юзали списки двойной вложенности :D Да большинство пользователей не умеют ими пользоваться ;)

 

Насчёт b, u, i: я просто не хочу, чтобы браузеры с валидаторами визжали, мол «ааа, некорректная вложеность тегов, иди ты нафиг, держи свою ошибку XML» :)

 

я в парсере замечал чушь - #ies в preg_match
да модификатор /e — вообще чушь :) вот хочу переписать свой пост-парсер под preg_replace_callback…

 

пару слов для публики
енто в процессе :)[1119444579:1119444935]Чёрт… оказывается, while можно убирать, но не у всех тегов…

например, у quote, list, size — не стоит.

 

У остальных — можно.

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
Так что стоит производить это улучшение?
Ссылка на комментарий
Поделиться на других сайтах

Я себе post_db_parse_bbcode вот так переписал. Вроде брешей не наделал :D

        //-----------------------------------------
       // 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;
       }

Сравните какой размер она имеет в оригинале ;)

Ссылка на комментарий
Поделиться на других сайтах

вроде как бы и правильно все, но с множественными bb кодами вероятно могут быть проблемы, знать бы зачем Мэтт их парсилку отдельно написал...
Ссылка на комментарий
Поделиться на других сайтах

  • 1 год спустя...

## Парсить <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'а?

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.