我有一个带有textarea的表单,用户可以在其中编写任何内容,包括网址。我试图将这些网址转换为HTML链接。
我可以这样做,直到只有1个网址,但是当有超过1个网址时,我有一个问题需要管理它们。
要转换1个网址,我使用此代码
$reg_ex_url = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
if( preg_match($reg_ex_url, $text, $url) ) {
$text = preg_replace($reg_ex_url, "<a href='".$url[0]."'>".$url[0]."</a> ", $text);
}
当然我想我必须使用preg_match_all(),但是如何循环结果来转换每个网址?
我忘了用preg_match_all()
添加我的尝试if( preg_match_all($reg_ex_url, $text, $urls) ) {
foreach($urls[0] as $url) {
$text = str_replace($url,'<a href="'.$url.'">'.$url.'</a>',$text);
}
}
这样可行,但对我来说似乎非常低效,如果用户写了很多链接,循环每次都需要多次迭代来修改1个URL。
新版本,但我还不确定它是最好的版本
if( preg_match_all($reg_ex_url, $text, $urls) ) {
foreach( $urls[0] as $url ) {
$sub[] = '<a href="'.$url.'">'.$url.'</a>';
}
$text = str_replace($urls[0],$sub,$text);
}
答案 0 :(得分:1)
使用preg_replace和backreferences
$reg_ex_url = "/((?:http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(?:\/\S*)?)/";
$text = preg_replace($reg_ex_url,'<a href="\1">\1</a>',$text);
群组(..)
已替换为非捕获群组(?:..)
,并添加了群组,以便\1
引用第一个群组(整个匹配)
否则\0
可用于引用整个匹配,使用原始正则表达式
$text = preg_replace($reg_ex_url,'<a href="\0">\0</a>',$text);
答案 1 :(得分:0)
您可以为此部分(:
创建非捕获组(http|https|ftp|ftps)
:
(?:http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?
使用preg_replace_callback也可能是一个选项:
$reg_ex_url = "/(?:http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
$text = "This is http://www.test.nowhere, and this is http://www.test2.nowhere";
$output = preg_replace_callback($reg_ex_url,
function($matches) {
$match = $matches[0];
return "<a href='".$match."'>".$match."</a> ";
}, $text);
echo $output;