我需要一个可以匹配结束标记的正则表达式

时间:2011-03-01 20:27:15

标签: regex html-parsing

我需要一个正则表达式,它可以匹配结束标记,例如</something>以及之后的任何和所有数据。请帮忙!

示例:

$html = '
   <div id="footer">
       <div class="wrap">
           <strong class="logo"><a href="#">College</a></strong>
           <ul><li><a href="#">Emergencies</a></li>
               <li><a href="#">Contact</a></li>
               <li><a href="#">Copyright</a></li>
               <li><a href="#">Terms of Use</a></li>
               <li><a href="#">Member of The Colleges</a></li>
           </ul><p>© 2010 College</p>
       </div>
   </div>
</body></html>
li>
               <li><a href="#">Contact</a></li>
               <li><a href="#">Copyright</a></li>
               <li><a href="#">Terms of Use</a></li>
               <li><a href="#">Member of The Colleges</a></li>
           </ul><p>© 2010 College</p>
       </div>
   </div>
</body></html>';

$html = preg_replace("#</html>.*#i", '', $html);
print ($html);

4 个答案:

答案 0 :(得分:2)

您正在尝试使用正则表达式解析HTML。正则表达式不足以安全地解析HTML。你需要的是一个HTML解析器。看看PHP的DOM module

答案 1 :(得分:0)

@"</[\da-zA-Z]+>.*"

或特定标签

@"</myTag>.*"

确保将正则表达式选项设置为忽略大小写。虽然确保解析xml的东西不是更有帮助。

答案 2 :(得分:0)

标签可以隐藏在评论,cdata,脚本和其他地方,和/或它可能只是无效。如果你说它不是任何类型的标记,你可以这样做:

/<\/something\s*>((?:(?!<\/something\s*>)[\S\s])+)/然后在全局循环中剥离捕获组1。除非a(?:something | something_else | ...)

,否则不需要捕获标记

修改
您的示例不起作用,因为您没有使用/ s修饰符。它在Perl中工作为$html =~ s/<\/html>.*//s;。此$html =~ s/<\/html>[\S\s]*//;不使用/ s修饰符。

将您的更改为#</html>[\S\s]*#i或使用/ s修饰符。点.将匹配除换行符之外的任何字符。使用/ s修饰符它也会匹配换行符。

以及更多刚试过,请使用$html = preg_replace("#</html>.*#is", '', $html);

答案 3 :(得分:0)

我认为这不会改变你的想法,但可能正则表达式并不是从html中提取结尾标记的最好方法。杰夫阿特伍德写了一篇很好的文章,说明为什么这不是解决这一特定问题的最佳方法。

Parsing Html The Cthulhu Way