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

Улучшение 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'а?

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

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

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

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