繁体   English   中英

提取html标签的正则表达式

[英]regular expression to extract html tags

我有一个需要获取的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使用LINQ to XML 轻松 编写XML读取XML文档

.xml是否被包围是否重要? 只需为Linq扎根,然后逐步完成即可。 简单,强大且易于维护。 通常,甚至不要考虑做您打算做的事情。

以下正则表达式匹配您的xml。 它还捕获了asp:content标记内的所有内容并将其放置在组1中。

(?s)<asp:Content ID="[^"]*"\W+ContentPlaceHolderID="[^"]*"\W+runat="[^"]*">(.*?)</asp:Content>

请注意,(?s)是内联修饰符,可在某些正则表达式中打开“点匹配新行”模式,例如.NET,Java,Perl,Python,PCRE for PHP的preg函数。

如果您使用其他正则表达式样式,则需要删除(?s)并以其他方式激活“点匹配新行”。

以下代码检索组捕获。 为了显示一般解决方案,主题字符串包含其中两个占位符。

<?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循环中的第二条回显线。

我认为这就是您想要的?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM