PHP - preg_replace反向引用

时间:2013-02-24 00:18:41

标签: php preg-replace backreference

我在理解如何使用preg_replace进行反向引用时遇到很大问题。

我有一个纯文本字符串,并希望用链接的HTML语法替换每个链接。因此,“www.mydomain.tld”或“http://www.mydomain.tld”或“http://mydomain.tld”应包含在HTML a-tag中。我找到了一个在线完成此功能的工作函数,但我想了解如何自己完成。

在我找到的功能中,这是替代品:

"\\1<a href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\">\\2</a>"

我在那里看到了一些转义的引号和这些位:\\1 \\2 根据PHP文档,这些是反向引用。但我如何使用它们,它们做什么?

我在规范中没有发现任何相关信息,所以任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:3)

这将为您完成这项工作。请参阅下面的说明,了解它如何运作。

$string = 'some text www.example.com more text http://example.com more text https://www.example.com more text';

$string = preg_replace('#\b(?:http(s?)://)?((?:[a-z\d-]+\.)+[a-z]+)\b#', "<a href='http$1://$2'>http$1://$2</a>", $string);

echo $string; // some text <a href='http://www.example.com'>http://www.example.com</a> more text <a href='http://example.com'>http://example.com</a> more text <a href='https://www.example.com'>https://www.example.com</a> more text

\b匹配字边界 (?:http(s?)://)?可选地匹配字符串(如果它包含'http://''https://',如果https抓取's',那么我们可以构建正确的网址

(?:[a-z\d-]+\.)+匹配一系列字母/数字后跟一个句号

[a-z]+匹配一系列字母,TLD,注意TLD现在开放购买,因此不再限制长度。见http://tinyurl.com/cle6jqb

然后我们通过将它们括在括号中来捕获除反向引用中's'之外的最后两个部分。

然后我们构建网址:

<a href='http$1://$2'>http$1://$2</a>

http$1://创建HTTP,如果HTTPS后向引用$1将包含's'

$2将包含域名。我们将URL作为链接文本的链接。

答案 1 :(得分:1)

你可能想要使用类似的东西:

$string = preg_replace('/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ ', "<a href=\"$1\">Link</a>", $yourtext);

一些有用的链接:
使用此工具试用正则表达式:click
来自:Nettuts的正则表达式 命名为反向引用:Click