REGEX用于在任意数量的嵌套自定义标记内匹配img标记

时间:2012-04-21 03:20:59

标签: php regex parsing custom-tags

我正在编写一个留言板,允许引用和引用其他用户的链接。留言板允许某些html标签,包括<img>。当引用消息时,我想找到<img>并用缩略图替换图片。这是我目前的代码:

<?php
 $pattern = "<quote msgid=\"t,(\d+),(\d+)@(\d+)\" from=\"([A-z0-9_\.-]+)\" posted=\"(\d+)\">(.+)<img src=\"https?:\/\/i\.(minus|imgur)\.com\/([A-z0-9_\.-]+)\.(jpg|gif|png|jpeg)\"( \/)?>";
 $replace = "<div class=\"quoted-message\" msgid=\"t,$1,$2@$3\"><div class=\"message-top\">From: $4 | Posted: $5</div>$6<img src=\"http:\/\/$7.com\/$8s\.$9\" />";
 $encoded = preg_replace($pattern, $replace, $encoded);
?>

模式本身有效,但我遇到的问题是嵌套引号不能很好用。例如,数据可能如下所示:

<quote msgid="t,1234,3456@0" from"user" posted="test">Some words here<quote msgid="t,5635,57456@0" from"user2" posted="test">Some more <b>words</b> here<quote msgid="t,1243532,3452@0" from"user" posted="test">Something else here<img src="linktoimage"/></quote>some words can go here</quote>or here</quote>

我当前的正则表达式将使用一个div标签替换前3个Opening引号标签,而不是仅匹配最内层标签。我知道它与(.+)有关,但我不知道我还能做些什么来检查先前的数据。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

正则表达式不太适合您的情况(very oddly explained here)。你应该真的使用解析器。

答案 1 :(得分:0)

(?!<quote.*?<quote)(<quote)

匹配最内层的引用标记。

http://regexr.com?30ng2