我正在尝试匹配所有超链接,即:
到目前为止,这段代码完成了相当不错的工作:
/**
* Convert links
*/
$str = preg_replace('$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' <a href="$1" target="_blank">$1</a> ', $str." ");
$str = preg_replace('$(www\.[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', '<a href="http://$1" target="_blank">$1</a> ', $str." ");
但我偶然发现了两个不起作用的VALID链接。参见:
任何可以找到所有匹配链接的解决方案?
答案 0 :(得分:0)
只在角色类中添加少量字符并使其不区分大小写才能一直使用它。但不是很好看:)
(?i)(https?://[a-z0-9_./?=&#-,;-]+)(?![^<>]*>)
答案 1 :(得分:0)
我最终使用了这个:
/**
* Convert URL to links
*/
function make_links($text) {
return preg_replace(
array(
'/(?(?=<a[^>]*>.+<\/a>)
(?:<a[^>]*>.+<\/a>)
|
([^="\']?)((?:https?|ftp|bf2|):\/\/[^<> \n\r]+)
)/iex',
'/<a([^>]*)target="?[^"\']+"?/i',
'/<a([^>]+)>/i',
'/(^|\s)(www.[^<> \n\r]+)/iex',
'/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+)
(\\.[A-Za-z0-9-]+)*)/iex'
),
array(
"stripslashes((strlen('\\2')>0?'\\1<a href=\"\\2\">\\2</a>\\3':'\\0'))",
'<a\\1',
'<a\\1 target="_blank">',
"stripslashes((strlen('\\2')>0?'\\1<a href=\"http://\\2\">\\2</a>\\3':'\\0'))",
"stripslashes((strlen('\\2')>0?'<a href=\"mailto:\\0\">\\0</a>':'\\0'))"
),
$text
);
}
到目前为止似乎工作得很好。