自动链接字符串中的URL

时间:2010-11-10 13:17:34

标签: php html

我有一个正常的消息输出$ msg。如果它是链接,我想让它链接。 (包含http://或www。)然后它应该成为<a href="http://google.com" target="_blank">http://google.com</a>

我从消息中剥离了html

$msg = htmlspecialchars(strip_tags($show["status"]), ENT_QUOTES, 'utf-8')

如何做到这一点,在许多地方都可以看到。

4 个答案:

答案 0 :(得分:4)

我遇到了像@SublymeRick一样的问题(在第一个点后停止,请参阅Auto-link URLs in a string)。

https://stackoverflow.com/a/8218223/593957获得一些灵感,我将其改为

$msg = preg_replace('/((http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?)/', '<a href="\1">\1</a>', $msg);

答案 1 :(得分:2)

通过PHP的preg_replace()函数为此使用正则表达式。

像这样......

preg_replace('/\b(https?:\/\/(.+?))\b/', '<a href="\1">\1</a>', $text);

阐释:

查找被(https?://(.+?))包围的\b,这是一个词头/词尾标记。

https?://很明显(s?表示's'是可选的。)

(.+?)表示任意数量的任何字符:'任何字符'由点表示; '任何数量'都是加号。问号意味着它不贪婪,因此它将允许其后面的项目(即单词的\b结尾)在第一次机会时匹配。这会阻止它一直持续到弦的末端。

整个表达式在括号中,以便它被取代到替换系统,并可以在第二个参数中使用\1重新插入。

答案 2 :(得分:0)

类似的东西:

 preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text);

可能?

答案 3 :(得分:0)

enter code h    function AutoLinkUrls($str,$popup = FALSE){
    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);
        }//end for
    }//end if
    return $str;
}//end AutoLinkUrlsere