2013-02-24 43 views
2

我有很大的问题,理解如何使用preg_replace与反向引用。PHP - preg_replace反向引用

我有一个纯文本字符串,并希望用链接的HTML语法替换每个链接。因此,应将“www.mydomain.tld”或“http://www.mydomain.tld”或“http://mydomain.tld”包装在HTML标签中。我发现了一个可以在线执行此功能的工作功能,但我想了解如何自己做。

在我发现的功能,这是更换:

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

我看到有一些逃脱了引号,并且这些位:\\1\\2
根据PHP文档,这些是反向引用。但是,我如何使用它们,他们做了什么?

我在规范中没有发现任何问题,所以任何帮助将不胜感激!

+0

你有看到这个http://php.net/manual/en/regexp.reference.back-references.php或http://www.regular-expressions.info/brackets.html吗? – elclanrs 2013-02-24 00:22:13

+0

这些不是反向引用。在这种情况下,他们是比赛组占位符。 – mario 2013-02-24 00:24:24

回答

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'所以我们可以建立正确的URL

(?:[a-z\d-]+\.)+比赛中的一个或一系列字母更发生/数字后跟一段时间

[a-z]+匹配一个或多个字母,顶级域名,注释顶级域名现在已经开放供购买,所以不能再限制长度了。请参阅http://tinyurl.com/cle6jqb

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

然后,我们建立的网址:

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

http$1://创建HTTP如果HTTPS反向引用$1将包含一个's'

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

+0

你怎么能在$ 1333 $ 2中逃避两个反向引用之间的数字333? – peter 2017-04-20 14:19:39

1

你可能想使用类似这样:

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

一些有用的链接:
尝试正则表达式使用这个工具:click
正则表达式的:Nettuts
命名后向引用:Click