Jump to content
View in the app

A better way to browse. Learn more.

IPBMafia.ru - поддержка Invision Community, релизы, темы, плагины и приложения

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

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

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

 залил в

testforum-public-min

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

 

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

-929206895.jpg

 

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

прошу помощи

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

Edited by kovboi

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

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

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

 

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

Спасибо!

Перевод от 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

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

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

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

Что-бы устранить этот баг мне пришлось откопать официальную версию 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

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



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

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

Linkify.php

Edited by Solovei

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

 

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

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

Edited by kgb

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

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

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

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

  • 4 недели спустя...
  • 5 месяцев спустя...

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

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

Добрый день.
Подскажите пожалуйста. У меня 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.

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.