3

<a href>我写了一个简单的函数,它接受一个文本块,从中提取 url,并用它们周围的标签替换所有 url 。

例如http://site.com应该成为<a href="http://site.com">http://site.com</a>

代码:

function parseUrls( $string )
{
    $string = trim($string);
    $pattern = '%\bhttp[s]?://[A-z0-9/\.\-_]+%i';
    $replacement = '<a href="$1">$1</a>';

    $string = preg_replace($pattern, $replacement, $string);

    return $string;
}

但是,如果我将以下字符串作为输入传递:

你好https://google.com测试http://test.com/something.html abc http://site.com

我得到的输出是:

hello <a href=""></a> test <a href=""></a> abc <a href=""></a> 

即,网址正在匹配,但未$replacement正确应用。可能是我的用法$1是错误的?

我究竟做错了什么?

4

3 回答 3

6

您的表达式中没有定义捕获组(通常由 完成())。所以$1是空的。但是$0,在您的替换模式中保存完整的匹配字符串。

所以要么使用,

$replacement = '<a href="$0" target="_BLANK">$0</a>';

或者

$pattern = '%\b(http[s]?://[A-z0-9/\.\-_]+)%i';
//             ^                          ^
//             |                          |
//             +-----  Capture group -----+
于 2012-08-21T17:56:57.887 回答
3

您没有$1可以引用的捕获组。

改为使用$replacement = '<a href="$0" target="_BLANK">$0</a>';

另外,不要在你的字符类中使用(它比你想象的匹配更多:在 ASCII和A-z之间有一些非字母字符)。就足够了,因为无论如何你已经让它不区分大小写了。ZaA-Z

于 2012-08-21T17:58:02.007 回答
1

您需要用方括号对表达式进行分组才能使用 $1。

$pattern = '%\b(http[s]?://[A-z0-9/.-_]+)%i';

于 2012-08-21T18:00:07.530 回答