正则表达式替换PHP中的字符串中的标签

时间:2014-05-30 22:16:38

标签: php regex url

我正在使用下面的PHP和Regex搜索一个巨大的字符串

[LINK]www.anyurl.com[/LINK]

并将其替换为:

<a href="http://www.anyurl.com">http://www.anyurl.com</a>

如果网址前面不存在http或ftp,则http://会被添加。

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*)\[\/LINK]/i'; 
$subst = '[LINK]http://$1[/LINK]'; 
$xtext = preg_replace($re, $subst, $xtext, 1);
$xtext = preg_replace("/(\[LINK\])(\S*)(\[\/LINK])/", "<a href=\"$2\" target='_blank'>$2</a>", $xtext);

我的问题是,它似乎仅适用于第一场比赛,而不是文档中的其他[LINK]www.urls.com[/LINK]。该文件为$xtext

3 个答案:

答案 0 :(得分:1)

哎呀,我刚刚发现了我的错误而且很简单。在我的第三行:

$xtext = preg_replace($re, $subst, $xtext, 1);

我在preg_replace的末尾有1个,即替换一次。这应该设置为-1或留空以替换所有。

答案 1 :(得分:0)

我认为你的问题可能是你的第一个正则表达式的贪婪。当您将http://添加到第一个找到的链接时,所有其他链接将保持不变。所以请尝试(注意第一行中的附加问号):

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*?)\[\/LINK]/i'; 
$subst = '[LINK]http://$1[/LINK]'; 
$xtext = preg_replace($re, $subst, $xtext);
$xtext = preg_replace("/(\[LINK\])(\S*)(\[\/LINK])/", "<a href=\"$2\" target='_blank'>$2</a>", $xtext);

答案 2 :(得分:0)

在第一个表达式中,需要删除1,正如您已经想到的那样。请注意,第二个表达式与第二个表达式相同,但*替换为+?,并删除了标签周围不必要的捕获组。 *不会停留在第一个[\LINK],而是停留在最后一个http://www.google.com[/LINK]\n[LINK]http://www.yahoo.com,导致链接显示文字,例如+?,因此需要$xtext = '[LINK]www.google.com[/LINK]\n[LINK]www.yahoo.com[/LINK]'; $re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*)\[\/LINK]/i'; $subst = '[LINK]http://$1[/LINK]'; $xtext = preg_replace($re, $subst, $xtext, 1); $xtext = preg_replace("/\[LINK\](\S+?)\[\/LINK]/", "<a href='$1' target='_blank'>$1</a>", $xtext);

{{1}}