我有一个正常的消息输出$ 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')
如何做到这一点,在许多地方都可以看到。
答案 0 :(得分:4)
我遇到了像@SublymeRick一样的问题(在第一个点后停止,请参阅Auto-link URLs in a string)。
从https://stackoverflow.com/a/8218223/593957获得一些灵感,我将其改为
$msg = preg_replace('/((http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)/', '<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