Лучший способ сделать ссылки интерактивными в блоке текста

для 32-разрядных процессоров интервал, вероятно, будет самым эффективным размером для обработки.

22
задан Silver Light 17 March 2011 в 15:31
поделиться

4 ответа

вам следует обратиться к этому ответу Заменить URL в тексте ссылками HTML

5
ответ дан 29 November 2019 в 03:35
поделиться
function makeClickableLinks($text)
{
$text = html_entity_decode($text);
$text = " ".$text;
$text= preg_replace("/(^|[\n ])([\w]*?)([\w]*?:\/\/[\w]+[^ \,\"\n\r\t<]*)/is", "$1$2<a href=\"$3\" >$3</a>", $text);  
$text= preg_replace("/(^|[\n ])([\w]*?)((www|wap)\.[^ \,\"\t\n\r<]*)/is", "$1$2<a href=\"http://$3\" >$3</a>", $text);
$text= preg_replace("/(^|[\n ])([\w]*?)((ftp)\.[^ \,\"\t\n\r<]*)/is", "$1$2<a href=\"$4://$3\" >$3</a>", $text);  
$text= preg_replace("/(^|[\n ])([a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+)+)/i", "$1<a href=\"mailto:$2@$3\">$2@$3</a>", $text);  
$text= preg_replace("/(^|[\n ])(mailto:[a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+)+)/i", "$1<a href=\"$2@$3\">$2@$3</a>", $text);  
$text= preg_replace("/(^|[\n ])(skype:[^ \,\"\t\n\r<]*)/i", "$1<a href=\"$2\">$2</a>", $text);  
        return $text;
}

работают с:

www.example.com

https://www.example.com

http://www.example.com

wap.example.com

ftp.example.com

user@example.com

skype: пример

mailto: user@example.com

atherprotocol: //example.com

5
ответ дан 29 November 2019 в 03:35
поделиться

Вдохновленный ответом Акаруна, я придумал функцию tis для обработки всех протоколов и ссылок, которые начинаются только с www.

function make_links($text, $class='', $target='_blank'){
    return preg_replace('!((http\:\/\/|ftp\:\/\/|https\:\/\/)|www\.)([-a-zA-Zа-яА-Я0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?!ism', 
    '<a class="'.$class.'" href="//$3" target="'.$target.'">$1$3</a>', 
    $text);
}

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

2
ответ дан 29 November 2019 в 03:35
поделиться

Также вдохновленный ответом Акаруна, следующая функция будет превращать ссылки только в текст, который еще не является ссылкой. Добавленная функциональность проверяет, что ссылка с захваченной текстовой ссылкой еще не существует в целевой строке:

function make_links_from_http($content) {   
    // Links out of text links
    preg_match_all('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', $content, $matches);
    foreach ($matches[0] as $key=>$link) {
        if (!preg_match('!<a(.*)'.$link.'(.*)/a>!i', $content))
        {
            $content = str_replace($link, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $content);
        }
    }

    return $content;
} 

Тестируя, я заметил, что вышеприведенная функция не работает в строке # 5. "Беспорядочная" функция, выполняющая эту работу, состоит в следующем:

function make_links_from_http($content) 
{
    // The link list
    $links = array();

    // Links out of text links
    preg_match_all('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', $content, $matches);
    foreach ($matches[0] as $key=>$link) 
    {
        $links[$link] = $link;
    }

    // Get existing
    preg_match_all('/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU', $content, $matches);
    foreach ($matches[2] as $key=>$value)
    {
        if (isset($links[$value]))
        {
            unset($links[$value]);
        }
    }

    // Replace in content
    foreach ($links as $key=>$link)
    {
        $content = str_replace($link, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $content);
    }

    return $content;
} 

Для нового кода я использовал учебник по адресу: http: //www.the-art-of-web .com / PHP / разбор ссылка /

2
ответ дан 29 November 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: