Перейти к содержимому
Русский язык для Invision Community 5

Вставка 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

Спасибо!

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

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

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

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

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

 

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

  • Автор

Написать разработчикам, или же обрамлять ссылку в ббкод 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');
           }
       }

  • Автор

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

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

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

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

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

Оригинальный - имеется ввиду оригинальный код из функции 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 или что-то еще не то?

  • Автор

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

 

#(.*?)(\()?((?: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, это не столь важно, все равно несовместимость несколько ссылок в одной строке остается. Попробуйте разместить две-три ссылки в одной строке без перевода строк, и несколько ссылок каждая с новой строки.

Создайте аккаунт или войдите в него для комментирования

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

При использовании данного сайта, вы согласаетесь с Условия использования и Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим..

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.