3

我在理解如何使用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 文档,这些是反向引用。但是我如何使用它们,它们有什么作用?

我在规范中一无所获,因此将不胜感激任何帮助!

4

2 回答 2

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]+匹配一个或多个出现的一系列字母 TLD,注意 TLD 现在可以购买,因此不能再限制长度。见http://tinyurl.com/cle6jqb

's'然后,我们通过将它们括在括号中来捕获最后两个部分以及反向引用。

然后我们构建 URL:

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

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

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

于 2013-02-24T01:51:51.423 回答
1

您可能想使用类似的东西:

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

一些有用的链接:
使用此工具尝试 Regex:单击
Regex 来自:Nettuts
命名反向引用:单击

于 2013-02-24T00:24:28.977 回答