【问题标题】:PHP - preg_replace backreferencingPHP - preg_replace 反向引用
【发布时间】:2013-02-24 00:18:41
【问题描述】:

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

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

【问题讨论】:

标签: php preg-replace backreference


【解决方案1】:

这将为您完成这项工作。请参阅下文,了解其工作原理。

$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',则创建 HTTP

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

【讨论】:

  • 你怎么能在$1333$2数字333中转义两个反向引用之间的数字?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多