转换为链接到文本中的所有ulrs的链接

时间:2018-02-02 10:53:03

标签: php regex

我有一个带有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);
}

2 个答案:

答案 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;

Online php demo