我有一个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?
答案 0 :(得分:1)
请参阅Reading XML documents using LINQ to XML和XML Made Easy with LINQ to XML
.xml被包围是否重要?只需给Linq一个根,然后通过它。简单,坚固且易于维护。 In general don't even think about doing what you are about to do.
答案 1 :(得分:0)
以下正则表达式匹配您的xml。它还捕获 asp:content标记内的所有内容,并将其放在第1组中。
(?s)<asp:Content ID="[^"]*"\W+ContentPlaceHolderID="[^"]*"\W+runat="[^"]*">(.*?)</asp:Content>
请注意,(?s)是内联修饰符,可以在某些正则表达式中打开“点匹配新行”模式,例如.NET,Java,Perl,Python,PCRE,用于PHP的preg函数。
如果您使用不同的正则表达式,则需要删除(?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循环中的第二个回显线。
我认为这就是你要找的东西?