使用preg_replace时,链接被替换为不期望的方式

时间:2015-06-14 04:24:53

标签: php regex preg-replace

我有一个带有正则表达式的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
^^^^                                         ^^^^

只有突出显示的部分会变成链接。

如何解决?

1 个答案:

答案 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>