用于提取HTML标记的正则表达式
本文关键字:正则表达式 提取 HTML 用于 | 更新日期: 2023-09-27 18:16:33
我有一个xml内部内容占位符,我需要得到,如:
<asp:Content ID="Content2" ContentPlaceHolderID="header" runat="server">
<div>
<categories>
<category>
<name>item 1</name>
<categories>
<category>
<name>item 1.1.</name>
</category>
<category>
<name>item 1.2.</name>
</category>
</categories>
</category>
</categories>
</div>
</asp:Content>
以此类推。我将在根类别上使用LINQ to XML构建适当的html,但是我无法用正则表达式提取所有XML。是否有更好的方法来提取xml?
参见使用LINQ to XML阅读XML文档和使用LINQ to XML简化XML
.xml是否被包围有关系吗?只要把根文件交给Linq,然后你自己来处理它。简单,坚固,易于维护。一般情况下,不要去想你即将要做的事情。
下面的regex 匹配您的xml。还捕获 asp:content标签中的所有内容,并将其放在第1组中。
(?s)<asp:Content ID="[^"]*"'W+ContentPlaceHolderID="[^"]*"'W+runat="[^"]*">(.*?)</asp:Content>
请注意,(?s)是内联修饰符,用于在某些正则表达式风格中打开"点匹配新行"模式,例如。net, Java, Perl, Python, PHP的preg函数的PCRE。
如果您正在使用不同的正则表达式风格,您将需要删除(?s)并以不同的方式激活"dot matches new line"。
下面的代码检索组捕获。为了显示通用的解决方案,主题字符串包含两个这样的占位符。
<?php
$subject='
<asp:Content ID="blah" ContentPlaceHolderID="blah" runat="blah">Capture Me!</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="header" runat="server">
<div>
<categories>
<category>
<name>item 1</name>
<categories>
<category>
<name>item 1.1.</name>
</category>
<category>
<name>item 1.2.</name>
</category>
</categories>
</category>
</categories>
</div>
</asp:Content>
';
preg_match_all('%(?s)<asp:Content ID="[^"]*"'W+ContentPlaceHolderID="[^"]*"'W+runat="[^"]*">(.*?)</asp:Content>%', $subject, $result,PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result); $i++) {
echo "Capture number: ".$i."<br />".htmlentities($result[1][$i][0])."<br /><br />";
// echo "Match number: ".$i."<br />".htmlentities($result[0][$i][0])."<br /><br/>";
}
?>
输出如下:
Capture number: 0
Capture Me!
Capture number: 1
<div> <categories> <category> <name>item 1</name> <categories> <category> <name>item 1.1.</name> </category> <category> <name>item 1.2.</name> </category> </categories> </category> </categories> </div>
如果您还想显示整个匹配(而不仅仅是捕获),只需取消for循环中的第二个回显行注释。
我想这就是你要找的东西吧?