我在理解如何使用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文档,这些是反向引用。但我如何使用它们,它们做什么?
我在规范中没有发现任何相关信息,所以任何帮助都会非常感激!
答案 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)