Разница обработки BB тегов IMG и URL

TorSav

User
TP version
other
После того, как вчера Беломохорочка (наш любимчик), осуществил мою мечту в теме: https://torrentpier.com/threads/bb-code-redaktor-kak-sdelat-ssylku-bez-domena.42306/ Я продолжил возится со своим сайтом. Но тут появилась одна хитрость.
Раньше я размещал скриншоты под спойлером просто в тегах img. На разных торент трекерах, владельцы, любят иметь каждых свой вид названий тем. Я выбрал с квадратными скобками. Далее, что бы особо не мудрить с именами папок и фотохостингами. Просто закидывал папки с фотками, с именами тем на форуме, себе на сайт (естественно с квадратными скобками). И все работало хорошо.

Потом я решил создать новую раздачу с фотками. Для этого под спойлером нужно было уже размещать не криншоты, а кликабельное превью. Для этого использовал код:
Code:
[url=ссылка_[на]_фото][img]ссылка_[на]_превью[/img][/url]
После чего ссылка после сохранения сообщения, обрезалась до вида:
Code:
ссылка_[на
PHP:
// [url]
        $url_exp = '[\w\#!$%&~/.\-;:=,?@а-яА-Я()\[\]+]+?';
        $text = preg_replace_callback("#\[url\]((?:https?://)?$url_exp)\[/url\]#isu", [&$this, 'url_callback'], $text);
        $text = preg_replace_callback("#\[url\](www\.$url_exp)\[/url\]#isu", [&$this, 'url_callback'], $text);
        $text = preg_replace_callback("#\[url=((?:https?://)?$url_exp)\]([^?\n\t].*?)\[/url\]#isu", [&$this, 'url_callback'], $text);
        $text = preg_replace_callback("#\[url=(www\.$url_exp)\]([^?\n\t].*?)\[/url\]#isu", [&$this, 'url_callback'], $text);
Аказывается.
- Раньше мне успешно удавалось писать [ ] в именах папок. Потому, что закрывающий тег [/img] ищется как одно целое вместе со скобкой.
- А в случае с url дело обстоит хитрее. Если закрывающую скобку писать после знака равно. То в регулярном выражении, просто будет найдено первое совпадение. Да! И это будет скобка из имени папки, а не тэга правее. :ROFLMAO:
Лечится так (сам придумал):
После последней строки вставить изменненые две последние строки, добавив двойные кавычки с экранированием.
PHP:
$text = preg_replace_callback("#\[url=[B]\"[/B]((?:https?://)?$url_exp)[B]\"[/B]\]([^?\n\t].*?)\[/url\]#isu", [&$this, 'url_callback'], $text);[/URL][/URL]
[URL='http://((?:https?://)?$url_exp)[B'][URL='http://((?:https?://)?$url_exp)[B']    $text = preg_replace_callback("#\[url=[B]\"[/B](www\.$url_exp)\[B]"\[/B]]([^?\n\t].*?)\[/url\]#isu", [&$this, 'url_callback'], $text);

И добавлять двойные кавычки, обязательно в тех ссылках, где есть квадратная закрывающаяся кавычка. Другие ссылки можно писать без кавычек, по прежнему.
А еще я на форуме заметил тему про оптимизацию. И вот это счасливое лицо =>
Кажется, как раз в ней разбирается и занимается. Я прям аж пожалел, что при регистрации не указал ник своей учетной записи как: "Оптимизатор". Ведь оптимизация из меня аж прет! Наверняка можно было бы написать, что то в виде этого, в одну строку:
PHP:
$text = preg_replace_callback("#[B]([/B]\[url=((?:https?://)?$url_exp)\][B]|[/B]\[url=[B]\"[/B]((?:https?://)?$url_exp)[B]\"[/B]\][B])[/B]([^?\n\t].*?)\[/url\]#isu", [&$this, 'url_callback'], $text);
Хотя я это не проверял и толком не разбераюсь. Уф. 😊 Прям хоть иди и пиши в тут темку. 🫣
 
Last edited:
В общем подумал, что кому то пригодится:
PHP:
        $text = preg_replace_callback("#\[url=\"((?:https?://)?$url_exp)\"\]([^?\n\t].*?)\[/url\]#isu", [&$this, 'url_callback'], $text);
        $text = preg_replace_callback("#\[url=\"(www\.$url_exp)\"\]([^?\n\t].*?)\[/url\]#isu", [&$this, 'url_callback'], $text);
Файл: src/Legacy/BBCode.php. Жалко тема перестала редактироваться. 15 минут мне оказалось мало. А там еще и все попереехало в ссылки чего то. А чего, уже не понять мне.
 
В принципе, в том что регулярные выражения не самые продуманные в классе BBCode - я не сомневаюсь.

Поэтому да, найденные проблемы вполне обоснованы, можно отнести к багам) Если такой фокус провернуть с каждым тегом, то абсолютно все поломаются) причем уверен что сломать так тег можно в любом движке / редакторе, это лишь вопрос желания. А так, даже самая хорошая регулярка скорее всего не покроет даже 99% вариантов использования тега, поэтому, даже не знаю стоит ли стараться усложнять регулярные выражения, или может найти какой-то более комплексный подход или вообще замену BBCode редактору в пользу того же WYSIWYG.
 
Last edited:
Если честно вообще и никогда не возникал вопрос использования относительных путей в ссылках, т.к большинстов ссылок копируются из адресной строки. Больше вопросов было о http или https, подумывал заменить это на
Code:
[url=//site.ru]ссылка[/url\]

Единственное удобство, что недавно заметил на рутрекере, при клике по URL кнопке в редакторе появляется
Code:
[url=][/url]
вместо
Code:
[url][/url]
 
Дружище, я не зря тебе отправлял ссылки в прошлый раз. Обязательно изучи матчасть и всё прояснится сразу. Я так тоже методом тыка пару лет пылася что-то делать.... ( я создавал пару лет сайты без знания в программировании, а после изучения php, js, regexp и прочего следующие пару лет их полностью переделывал)

Изучи синтаксис regexp, служебные симолы типа [ ] надо обязательно экранировать

Тренируйся в песочнице. Я тебе создал пример по ссылке regex101: build, test, and debug regex
//
Наличие символа ] внутри
Code:
[url=]
- это проблема
 
Last edited:
Единственное удобство, что недавно заметил на рутрекере, при клике по URL кнопке в редакторе появляется
Code:
[url=][/url]
вместо
Code:
[url][/url]
Такое добавить достаточно просто из коробки. Стоит ли? Что скажешь?
 
Такое добавить достаточно просто из коробки. Стоит ли? Что скажешь?
Просто, но рядовой пользователь не знает что такое bbcode и в некоторых случаях он может сотворить такое
Code:
[url=]http://site.ru[/url]
или эдакое
Code:
[url=]текст[/url]
Я за то чтобы сделать как в xenforo - всплывающее окошко

В последнее время стараюсь все переводить на ajax и user friendly
 
Last edited:
Просто, но рядовой пользователь не знает что такое bbcode и в некоторых случаях он может сотворить такое
Code:
[url=]http://site.ru[/url]
или эдакое
Code:
[url=]текст[/url]
Я за то чтобы сделать как в xenforo - всплывающее окошко

В последнее время стараюсь все переводить на ajax и user friendly
И то верно. Именно страх что для конечного пользователя что-то будет не очевидно - останавливает меня делать какие-либо крупные изменения по части использования. У нас итак весь движок по сути не очевидный для мигранта с DLE например, или вообще новичка.

Есть много планов которые я потихоньку реализую, именно в сторону улучшения удобства/установки.
 
Я начинал с DLE и мне очень приглянулся torrentpier из-за простоты кода. Но после добавления \library\Zend и ООП жизнь новичиков усложнилась :)

Интересно, какая часть \library\Zend вообще используется в движке? Я топил за то чтоб пилились свои классы и функции (с элементами воровства).

После обновления структуры старички остались без модов и обнов.

Лично меня (как вечного новичка) пугает огромная череда наследований в коде.... А если слышу про инкапсуляцию и полиморфизм, то всё, удаляю эту cms/framework :LOL:
 
Last edited:
Back
Top