繁体   English   中英

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

[英]Regex to replace tags in a string in PHP

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

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

并替换为:

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

如果http或ftp已经存在于url前面,则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

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

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

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

我认为你的问题可能是你的第一个正则表达式的贪婪。 当您将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);

在第一个表达式中,需要删除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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM