正则表达式来提取html标签

时间:2011-12-04 22:48:30

标签: c# asp.net regex

我有一个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?

2 个答案:

答案 0 :(得分:1)

请参阅Reading XML documents using LINQ to XMLXML 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循环中的第二个回显线。

我认为这就是你要找的东西?