我在SO上发现了将文本链接更改为超链接的代码:
function auto_link_text($text)
{
$pattern = '#'b((['w-]+://?|www[.])[^'s()<>]+(?:'(['w'd]+')|([^[:punct:]'s]|/)))#';
$callback = create_function('$matches', '
$url = array_shift($matches);
$url_parts = parse_url($url);
$text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
$text = preg_replace("/^www./", "", $text);
$last = -(strlen(strrchr($text, "/"))) + 1;
if ($last < 0) {
$text = substr($text, 0, $last) . "…";
}
return sprintf(''<a rel="nowfollow" href="%s">%s</a>'', $url, $text);
');
return preg_replace_callback($pattern, $callback, $text);
}
然而,它似乎将它们更改为超链接,即使它们已经是超链接的一部分,所以您最终会得到类似<a href="<a href
(等等)的内容。我想我可以做的是检查一个已经格式化的超链接,如果我找不到,我可以执行该功能。或者甚至将支票放入函数中。所以类似于:
function auto_link_text($text)
{
if preg_match(proper stuff in here){
return $text;
}else{
$pattern = '#'b((['w-]+://?|www[.])[^'s()<>]+(?:'(['w'd]+')|([^[:punct:]'s]|/)))#';
$callback = create_function('$matches', '
$url = array_shift($matches);
$url_parts = parse_url($url);
$text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
$text = preg_replace("/^www./", "", $text);
$last = -(strlen(strrchr($text, "/"))) + 1;
if ($last < 0) {
$text = substr($text, 0, $last) . "…";
}
return sprintf(''<a rel="nowfollow" href="%s">%s</a>'', $url, $text);
');
return preg_replace_callback($pattern, $callback, $text);
}
}
或者可能应该更改函数中的正则表达式。
在正则表达式的第一个#
之后添加(?<!href=")
。这将确保它不在标签中。