codeigniter auto_link не добавляет ссылки без www - PullRequest
0 голосов
/ 17 февраля 2012

Если я наберу

www.google.com или http://www.google.com

с использованием функции auto_link() добавит ссылку правильно ..

Однако, если я наберу

google.com

функция не работает с www. часть отсутствует ...

как я могу убедиться, что он будет также включать эти ссылки ??

Это функция из codeigniter:

/**
 * Auto-linker
 *
 * Automatically links URL and Email addresses.
 * Note: There's a bit of extra code here to deal with
 * URLs or emails that end in a period.  We'll strip these
 * off and add them after the link.
 *
 * @access  public
 * @param   string  the string
 * @param   string  the type: email, url, or both
 * @param   bool    whether to create pop-up links
 * @return  string
 */
if ( ! function_exists('auto_link'))
{
    function auto_link($str, $type = 'both', $popup = FALSE)
    {
        if ($type != 'email')
        {
            if (preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches))
            {
                $pop = ($popup == TRUE) ? " target=\"_blank\" " : "";

                for ($i = 0; $i < count($matches['0']); $i++)
                {
                    $period = '';
                    if (preg_match("|\.$|", $matches['6'][$i]))
                    {
                        $period = '.';
                        $matches['6'][$i] = substr($matches['6'][$i], 0, -1);
                    }

                    $str = str_replace($matches['0'][$i],
                                        $matches['1'][$i].'<a href="http'.
                                        $matches['4'][$i].'://'.
                                        $matches['5'][$i].
                                        $matches['6'][$i].'"'.$pop.'>http'.
                                        $matches['4'][$i].'://'.
                                        $matches['5'][$i].
                                        $matches['6'][$i].'</a>'.
                                        $period, $str);
                }
            }
        }

        if ($type != 'url')
        {
            if (preg_match_all("/([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]*)/i", $str, $matches))
            {
                for ($i = 0; $i < count($matches['0']); $i++)
                {
                    $period = '';
                    if (preg_match("|\.$|", $matches['3'][$i]))
                    {
                        $period = '.';
                        $matches['3'][$i] = substr($matches['3'][$i], 0, -1);
                    }

                    $str = str_replace($matches['0'][$i], safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str);
                }
            }
        }

        return $str;
    }
}

РЕШЕНИЕ: функция auto_link ($ str, $ type = 'both', $ popup = FALSE) { if ($ type! = 'email') { if (! preg_match_all ("/ ^ ([a-zA-Z0-9 _.-]) + @ ([a-zA-Z0-9 _.-]) + \. ([a-zA-Z]) + ( [a-zA-Z]) + / ", $ str, $ match)) {

        if (preg_match_all("/(?:https?\:?(?:\/\/)?|www\.)?([a-zA-Z0-9\-\.]+\.(?:.[a-z]*))/mi", $str, $matches))
        {
            $pop = ($popup == TRUE) ? " target=\"_blank\" " : "";

            for ($i = 0; $i < count($matches['0']); $i++)
            {

                            $str = str_replace($matches[0][$i],
                                                '<a href="http://'.$matches[1][0].'" class="auto_link_color">'.$matches[1][0].'</a>', $str);
            }
        }
            }else{
                for ($i = 0; $i < count($matches['0']); $i++)
                {
                    $str = str_replace($matches[0][$i], $matches[0][0], $str);
                }
            }
    }

    return $str;
}

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

Ответы [ 4 ]

3 голосов
/ 17 февраля 2012

Автолинк должен правильно перехватить http://google.com. Вы говорите, что это не работает?

Регулярное выражение автолинка использует наличие http (s) или www, чтобы указать, что ссылка присутствует,Без любой из этих опций вам пришлось бы изменить регулярное выражение, чтобы обнаруживать его только в домене верхнего уровня .com, что будет очень проблематично, учитывая широкий спектр возможных доменов верхнего уровня (.net, .org, .biz и т. Д.).).Если вы обдумаете это, вы, вероятно, не захотите менять это регулярное выражение, потому что обслуживание всех возможных доменов и добавляемых новых будет гораздо более громоздким, чем оно того стоит.

1 голос
/ 22 февраля 2012

Извините, но вы используете auto_link () неправильно.

Предполагается, что параметр является действительным URL или адресом электронной почты. Ввод только "www.google.com" не допускается и не должен работать вообще: -)

Итак, вы должны сделать:

auto_link('http://www.google.com')
auto_link('http://google.com')

Никогда не пропуская "http://" в начале.

0 голосов
/ 25 февраля 2012
function auto_link($str, $type = 'both', $popup = FALSE)
{
    if ($type != 'email')
    {
            if (!preg_match_all("/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\\.([a-zA-Z])+([a-zA-Z])+/", $str, $matches)){

        if (preg_match_all("/(?:https?\:?(?:\/\/)?|www\.)?([a-zA-Z0-9\-\.]+\.(?:.[a-z]*))/mi", $str, $matches))
        {
            $pop = ($popup == TRUE) ? " target=\"_blank\" " : "";

            for ($i = 0; $i < count($matches['0']); $i++)
            {

                            $str = str_replace($matches[0][$i],
                                                '<a href="http://'.$matches[1][0].'" class="auto_link_color">'.$matches[1][0].'</a>', $str);
            }
        }
            }else{
                for ($i = 0; $i < count($matches['0']); $i++)
                {
                    $str = str_replace($matches[0][$i], $matches[0][0], $str);
                }
            }
    }

    return $str;
}

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

0 голосов
/ 23 февраля 2012

Если вы не используете «http://"» или «www.» В качестве триггера «link this», вам придется кодировать его, чтобы перехватить .com, .org, .net (и постоянно расширяющийся набор возможностей). Как другие предлагали, сделать этот регистр ex "жадным" будет соответствовать вещам, которые не должны быть ссылками. Вам решать взвешивать баланс, основываясь на ваших приоритетах.

Вот (очень упрощенный) маленький эксперимент, который я попробовал:

<?php

header("Content-type: text/plain");

$text = 'http://google.com
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in urna auctor tellus consequat cursus.
Cras malesuada magna eget felis accumsan vel dictum urna sodales. Vestibulum erat ante, rutrum et
aliquet vel, convallis eu google.com. Phasellus interdum velit at urna google.com porta. Donec at interdum
nibh. Fusce ultricies varius elit id egestas. Suspendisse dolor risus, vulputate vel rutrum in,
http://google.com et nisi. Etiam non massa non neque lacinia adipiscing sed nec metus. Sed fermentum ultricies
dui at porta. Duis at lacinia tortor. Nam mi est, mollis sed viverra et, mollis ac lorem. In mattis
lacinia tempor.

Sed in luctus nunc. Mauris nec tincidunt dui. Vivamus interdum, velit sed lobortis lobortis, nulla dui
vestibulum dui, eu tincidunt arcu felis et massa. google.COM vitae porta felis. Sed sit amet magna augue.
Aenean dignissim tempus porta. Donec ultrices lectus ac sapien gravida sodales. Quisque malesuada
sagittis rhoncus. Vestibulum mattis auctor ligula, eu tempus odio hendrerit in. Ut vel elit ipsum. Sed
ante lorem, www.google.com et dictum nec, ultricies a lorem.
';

$domains = 'com|org|net';

if ( !preg_match_all('#([\S]*)(\.('.$domains.']))#i', $text, $matches))
{
    die('no matches');
}

print_r($matches);

Выход:

Array
(
    [0] => Array
        (
            [0] => http://google.com
            [1] => google.com
            [2] => google.com
            [3] => http://google.com
            [4] => google.COM
            [5] => www.google.com
        )

    [1] => Array
        (
            [0] => http://google
            [1] => google
            [2] => google
            [3] => http://google
            [4] => google
            [5] => www.google
        )

    [2] => Array
        (
            [0] => .com
            [1] => .com
            [2] => .com
            [3] => .com
            [4] => .COM
            [5] => .com
        )

    [3] => Array
        (
            [0] => com
            [1] => com
            [2] => com
            [3] => com
            [4] => COM
            [5] => com
        )

)
...