Jump to content

Некорректная обработка длинных ссылок

Featured Replies

comment_37693

как правильно установить этот патч?

после открытия архива файл minify_patch_07_13 - public-min-config.php

 залил в

testforum-public-min

 с заменой файла

 

сообщение в АЦ осталось

-929206895.jpg

 

что не так делаю?

прошу помощи

спасибо заранее

Edited by kovboi

comment_37722

podvorie, и на этом форуме такой проблемы нет. Запарился уже. После установки того патча (345_linkify.zip) что-то надо сделать?

нет. У меня все сразу заработало.

comment_38046

Здравствуйте.

При вставке в текст сообщения длинной ссылки получается, что движок (или сам редактор) пытается сделать из нее активную гиперссылку и делает это с ошибкой, обрабатывая только часть ссылки.

Т.е. вставляю длинную ссылку, а на выходе полный текст ссылки, но только часть ее сделана гиперссылкой.

 

Как это исправить?

Спасибо!

Перевод от IBR? Если да, то дело в нем.

 

Я решил этот баг так. Внимание, это для версии 3.4.5 , но думаю в ранних версиях аналогично

 

Файл /ips_kernel/HTMLPurifier/HTMLPurifier/Injector/Linkify.php

 

 

находим код 

        $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 )

меняем на 

        $uni=(IPS_DOC_CHAR_SET=="UTF-8")?"u":"";
        preg_match_all( "#(.*?)(()?((?:http|ftp|https)://[а-яА-Яw-_]+(?:.[а-яА-Яw-_]+)?(?:[а-яА-Яw-.,()@?^=%&:/~+#]*[а-яА-Яw-@?^=%&/~+#]))(.*?)$#ims" . $uni, $token->data, $matches );

сохраняем файл (обязательно!!) в кодировке UTF-8 (без BOM!!!!). Теперь все работает, по крайней мере у меня так.

 

Мой файл Linkify.php  в аттаче

Linkify.zip

comment_38050

spoken,

ну вот, можете посмотреть, и русские урлы и транслит обрабатывает 

__homemasters.ru/forum/topic/23228-obsuzhdenie-novogo-foruma/page-7#entry266331

  • 3 недели спустя...
comment_40105

Вот точна такая-же проблема ссылками,попробую выше перечисленные способы,может поможет  :)

comment_40197

Вообщем я пришел к окончательному решению этой проблемы!

Все дело в том что администратор этого сайта распространяет этим безобразным багом от которого ссылки не правильно вставляются и получается так что пол ссылки кликабельная а дальше она как текст!

Что-бы устранить этот баг мне пришлось откопать официальную версию IPB 3.4.4 и вытащить с нее файлик - Linkify.php

Теперь давайте посмотрим чем отличается этот файлик от файлика который валяется в IPB 3.4.4 представленным администратором этого прекрасного форума!

 

Исходник файла Linkify.php от IPB 3.4.4 скаченного с этого форума

<?php


/**
 * Injector that converts http, https and ftp text URLs to actual links.
 */
class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
{


    public $name = 'Linkify';
    public $needed = array('a' => array('href'));


    public function handleText(&$token) {
        if (!$this->allowsElement('a')) return;


        if (strpos($token->data, '://') === false) {
            // our really quick heuristic failed, abort
            // this may not work so well if we want to match things like
            // "google.com", but then again, most people don't
            return;
        }
//print $token->data;
        // there is/are URL(s). Let's split the string:
        // Note: this regex is extremely permissive
        //$bits = preg_split('#((?:https?|ftp)://[^s'"<>()]+)#S', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
        /* MODIFIED April 26, 2013
            @link __community.invisionpower.com/resources/bugs.html/_/ip-board/links-being-corrupted-or-malformed-in-board-and-nexus-r41993
            Test case:
__invisionpower.com,
__invisionpower.com.
__invisionpower.com
https://invisionpower.com
https://blah.gov/blah-blah.as
__en.wikipedia.org/wiki/Chi_(mythology)
(__google.com)
             */
        $uni=(IPS_DOC_CHAR_SET=="UTF-8")?"u":"";
        preg_match_all( "#(.*?)(()?((?:http|ftp|https)://[p{L}-_]+(?:.[p{L}-_]+)?(?:[p{L}-.,()@?^=%&amp;:/~+#]*[p{L}-@?^=%&amp;/~+#]))(.*?)$#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]);
                    }
                }
            }
        }
//print_r($token);exit;
    }


}


// vim: et sw=4 sts=4

Исходник файла Linkify.php от IPB 3.4.4 скаченного с официального форума

<?php


/**
 * Injector that converts http, https and ftp text URLs to actual links.
 */
class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
{


    public $name = 'Linkify';
    public $needed = array('a' => array('href'));


    public function handleText(&$token) {
        if (!$this->allowsElement('a')) return;


        if (strpos($token->data, '://') === false) {
            // our really quick heuristic failed, abort
            // this may not work so well if we want to match things like
            // "google.com", but then again, most people don't
            return;
        }
//print $token->data;
        // there is/are URL(s). Let's split the string:
        // Note: this regex is extremely permissive
        //$bits = preg_split('#((?:https?|ftp)://[^s'"<>()]+)#S', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
        /* MODIFIED April 26, 2013
            @link __community.invisionpower.com/resources/bugs.html/_/ip-board/links-being-corrupted-or-malformed-in-board-and-nexus-r41993
            Test case:
__invisionpower.com,
__invisionpower.com.
__invisionpower.com
https://invisionpower.com
https://blah.gov/blah-blah.as
__en.wikipedia.org/wiki/Chi_(mythology)
(__google.com)
             */
        preg_match_all( "#(.*?)(()?((?:http|ftp|https)://[w-_]+(?:.[w-_]+)?(?:[w-.,()@?^=%&amp;:/~+#]*[w-@?^=%&amp;/~+#]))(.*?)$#ims", $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) )
        {
            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]);
                    }
                }
            }
        }
//print_r($token);exit;
    }


}


// vim: et sw=4 sts=4

 

Ну вот,теперь вы сами увидели своими глазами что в этих двух файлах есть отличия!

Вообщем ребят не буду тут демагогию разводить если хотите от этого бага избавится то идите по этому пути:

ips_kernel/HTMLPurifier/HTMLPurifier/Injector/Linkify.php

и все содержимое файла Linkify.php сотрите и закиньте в него код от официального файла и будет вам счастье!

Edited by Solovei

comment_40201

Вот сам файл,его подмените на свой и воля (только для IPB 3.4.5)



Этот сайт не виноват, это авторы пакета русификации IBR сломали этот файл.

Возможно и так  :P  Ах да я там выше пост написал по устранению этого бага и ошибся в версиях,в место 3.4.5 я написал 3.4.4

Linkify.php

Edited by Solovei

comment_40372

Возможно и так   Ах да я там выше пост написал по устранению этого бага и ошибся в версиях,в место 3.4.5 я написал 3.4.4 Прикрепленные файлы

 

Вы выложили оригинальный Linkify.php .

Но он не устраняет этот баг, если в ссылках используется кирилица, как, например, на этом форуме. Мой вариант работает как с латиницей так и с кирилицей

Edited by kgb

comment_40378

Вы выложили оригинальный Linkify.php .

Но он не устраняет этот баг, если в ссылках используется кирилица, как, например, на этом форуме. Мой вариант работает как с латиницей так и с кирилицей

Спасибо, Ваш вариант помог с сылками.
comment_41320

Ребят подскажите пожалуйста как в этот код добавить ещё символ "|" без него ссылка перестаёт работать, а после отправки сообщения он меняется на %7C

  • 4 недели спустя...
  • Author
comment_43782
kgb, даже с вашим файлом ссылки типа ipbmafia.ru/topic/test206/ парсятся у меня только до цифр. Задолбала эта проблема.
  • 5 месяцев спустя...
comment_56861

Ребят, а как запретить автоматическое преобразование ссылок вида __site.ru в активные ссылки? В общем нужно чтобы ссылки добавлялись просто как текст.

  • 1 месяц спустя...
comment_60376

Никто не сталкивался проблемой, что ссылки с подчеркиванием типа __some_domain.com/ постятся некорректно?

Edited by joefast

  • 9 месяцев спустя...
comment_79899

Добрый день.
Подскажите пожалуйста. У меня ipb 3.4.6.
При попытке закоментить топик стартера жмем ПКМ "Вставить" текст. CTRL+V тоже не приводят к желаемому результату. Где копать не подскажите?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.