我有一个带有正则表达式的array
我用来代替使用preg_replace
链接的URL / hashtags:
$regs = array('!(\s|^)((https?://|www\.)+[a-z0-9_./?=;&#-]+)!i', '/#(\w+)/');
$subs = array(' <a href="$2" target="_blank">$2</a>', '<a href="/hashtag/$1" title="#$1">#$1</a>');
$output = preg_replace($regs, $subs, $content);
如果$content
有链接,例如https://www.google.com/
,则会正确替换;如果有一个标签后跟一个文本,例如:#hello
替换,但是,如果有一个带标签的链接,例如:https://www.google.com/#top
替换如下:
#top" target="_blank">https://www.google.com/#top
^^^^ ^^^^
只有突出显示的部分会变成链接。
如何解决?
答案 0 :(得分:1)
这是因为你在数组中的第二个正则表达式也在字符串#
之后匹配部分。
将正则表达式更改为:
$regs = array('!(\s|^)((https?://|www\.)+[a-z0-9_./?=;&#-]+)!i', '/(?<=[\'"\s]|^)#(\w+)/');
$subs = array(' <a href="$2" target="_blank">$2</a>', '<a href="/hashtag/$1" title="#$1">#$1</a>');
$content = 'https://www.google.com/#top foobar #name';
# now use in preg_replace
echo preg_replace($regs, $subs, $content);
它会给你:
<a href="https://www.google.com/#top" target="_blank">https://www.google.com/#top</a> foobar <a href="/hashtag/name" title="#name">#name</a>