Skip to content

Вставка url в ответ

Доброго времени суток!

При вставке ссылки из буфера обмена в форму ответа и последующей отправки ответа ...

В сообщении криво отображаеться ссылка...

Например: иммеем ссылку вида _http://domain.ru/forum/topic/76643-novyi-forum/?p=1601360

А получаем вот такое преобразование

[url=http://domain.ru/forum/topic/]http://domain.ru/forum/topic/[/url]76643-novyi-forum/?p=1601360

http://domain.ru/forum/topic/76643-novyi-forum/?p=1601360

 

Как починить?

Форум 3.4.5

Спасибо!

Featured Replies

Обратите внимание

По указанному вами в профиле "Board url" находится не IP.Board, либо модифицированный пиратский скрипт с удаленными копирайтами. Если вы указали неверный URL, пожауйста, поправьте его, потому что он скорее всего потребуется при диагностике вашей проблемы. Нелицензионные скрипты не приветствуются, т.к. зачастую именно некорректное "нуление" и является причиной проблем в них.

Как починить?

Написать разработчикам, или же обрамлять ссылку в ббкод url

 

[url]http://domain.ru/forum/topic/76643-novyi-forum/?p=1601360[/url]

  • Author

Написать разработчикам, или же обрамлять ссылку в ббкод url

 

[url]http://domain.ru/forum/topic/76643-novyi-forum/?p=1601360[/url]

Спасибо!

На старой версии 3.1.4 - при вставке просто ссылки в ответ - движок автоматически обрамлял.... а счаз беда...

Автоматически никогда ничего не обрамлялось. Просто парсеры стали разными. А виноват во всем все тот же HTMLPurifier

Открыть /ips_kernel/htmlpurifier/HTMLPurifier/Injector/Linkify.php

 

Найти регулярку:

#(.*?)(\()?((?:http|ftp|https):\/\/[\p{L}\-_]+(?:\.[\p{L}\-_]+)?(?:[\p{L}\-\.,\(\)@?^=%&:\/~\+\#]*[\p{L}\-\@?^=%&\/~\+\#]))(.*?)$#ims

Заменить на:

#(.*?)(\()?((?:http|ftp|https):\/\/[\p{L}\d\-_]+(?:\.[\p{L}\d\-_]+)?(?:[\p{L}\d\-\.,\(\)@?^=%&:\/~\+\#]*[\p{L}\d\-\@?^=%&\/~\+\#]))(.*?)$#ims

 

Добавился метасимвол \d для захват цифр.

Но еще остается баг, что в одной строке вторая и последующие ссылки не парсятся. Парсится только первая.

По хорошему весь их этот код

 

       $uni = (IPS_DOC_CHAR_SET=="UTF-8") ? "u" : "";
       preg_match_all( "#(.*?)(\()?((?:http|ftp|https):\/\/[\p{L}\-_]+(?:\.[\p{L}\-_]+)?(?:[\p{L}\-\.,\(\)@?^=%&:\/~\+\#]*[\p{L}\-\@?^=%&\/~\+\#]))(.*?)$#ims" . $uni, $token->data, $matches );
       //print_r($matches);exit;

       //$token = array();

       // $i = index
       // $c = count
       // $l = is link
       /*for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
           if (!$l) {
               if ($bits[$i] === '') continue;
               $token[] = new HTMLPurifier_Token_Text($bits[$i]);
           } else {
               $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
               $token[] = new HTMLPurifier_Token_Text($bits[$i]);
               $token[] = new HTMLPurifier_Token_End('a');
           }
       }*/

       if( is_array($matches) AND count($matches) )
       {	
		$token = array();//by denchu 06062013
           foreach( $matches[0] as $k => $match )
           {
               if( !$matches[3][$k] )
               {
                   $token[]   = new HTMLPurifier_Token_Text($token->data);
               }
               else
               {
                   if( $matches[1][$k] )
                   {
                       $token[] = new HTMLPurifier_Token_Text($matches[1][$k]);
                   }

                   if( $matches[2][$k] )
                   {
                       $token[] = new HTMLPurifier_Token_Text($matches[2][$k]);
                   }

                   if( !$matches[2][$k] AND $matches[4][$k] == ')' )
                   {
                       $matches[3][$k] .= ')';
                       unset($matches[4][$k]);
                   }

                   $token[] = new HTMLPurifier_Token_Start('a', array('href' => $matches[3][$k]));
                   $token[] = new HTMLPurifier_Token_Text($matches[3][$k]);
                   $token[] = new HTMLPurifier_Token_End('a');

                   if( $matches[4][$k] )
                   {
                       $token[] = new HTMLPurifier_Token_Text($matches[4][$k]);
                   }
               }
           }
       }

 

надо заменить на оригинальный, пока не сделают нормальную обработку урлов.

 

       $uni = (IPS_DOC_CHAR_SET=="UTF-8") ? "u" : "";
       $bits = preg_split('#((?:http|ftp|https)://[\p{L}\d\-_]+(?:\.[\p{L}\d\-_]+)?(?:[\p{L}\d\-\.,\(\)@?^=%&:\/~\+\#]*[\p{L}\d\-\@?^=%&\/~\+\#]))#i'.$uni, $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);

       $token = array();

       // $i = index
       // $c = count
       // $l = is link
       for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
           if (!$l) {
               if ($bits[$i] === '') continue;
               $token[] = new HTMLPurifier_Token_Text($bits[$i]);
           } else {
               $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
               $token[] = new HTMLPurifier_Token_Text($bits[$i]);
               $token[] = new HTMLPurifier_Token_End('a');
           }
       }

  • Author

Спасибо огромное!!!

Помогло.....

По хорошему весь их этот код

надо заменить на оригинальный, пока не сделают нормальную обработку урлов.

Кто имеется в виду под их и что такое оригинальный (чей?). Ничего непонятно.

Оригинальный - имеется ввиду оригинальный код из функции HTMLPurifier_Injector_Linkify::handleText() в библиотеки htmlpurifier (сторонняя библиотека которая прикручена к IPB и модифицирована IPS), тот маленький кусочек закаментированого кода. Ладно регулярное выражение то понятно, но зачем заменили preg_split на preg_match_all с которого довольно трудно получить результат соответствующей старой логике - не понятно.

Ничего не менял в Linkify.php или где-то еще в лицензионной версии 3.4.5.

 

Ссылка топик стартера нормально парсится:

 

XRHBp.jpg

 

Посмотрю, что у меня в Linkify.php сейчас..

У меня стоит строка:

 

#(.*?)(\()?((?:http|ftp|https):\/\/[\w\-_]+(?:\.[\w\-_]+)?(?:[\w\-\.,\(\)@?^=%&:/~\+\#]*[\w\-\@?^=%&/~\+\#]))(.*?)$#ims"

 

У топик стартера локализация от IBR или что-то еще не то?

  • Author

У меня стоит строка:

 

#(.*?)(\()?((?:http|ftp|https):\/\/[\w\-_]+(?:\.[\w\-_]+)?(?:[\w\-\.,\(\)@?^=%&:/~\+\#]*[\w\-\@?^=%&/~\+\#]))(.*?)$#ims"

 

У топик стартера локализация от IBR или что-то еще не то?

 

Залил оригинальный...и все заработало... Еще раз Всем спасибо!!!

Особенно siv1987

 

З.Ы.Версия лицензия 3.4.5 + локализация IBR поверх...

Залил оригинальный...и все заработало... Еще раз Всем спасибо!!!

Особенно siv1987

 

З.Ы.Версия лицензия 3.4.5 + локализация IBR поверх...

 

А почему не пишите гневные письма на форуме техподдержки IBR?!

 

И второй вопрос: чем прекрасна локализация, а не просто перевод, которых масса бесплатных и платных? Хотя бы вот на вашем примере?

У меня стоит строка:

У топик стартера локализация от IBR или что-то еще не то?

На сколько я вижу идентично, за исключением метасимвола \w который заменен на юникод \p{L}. ИБР-овцы видимо забыли, что в \p{L} числовой класс (0-9) не входит как в случае с \w. За то последний не будет работать с урл-ами в которых есть кириллица в utf-8 с не правильно установленной локалью. Можно заменить \p{L} на \w, можно после добавить 0-9, это не столь важно, все равно несовместимость несколько ссылок в одной строке остается. Попробуйте разместить две-три ссылки в одной строке без перевода строк, и несколько ссылок каждая с новой строки.

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.