我正在使用下面的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
答案 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}}