用于提取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?

用于提取HTML标记的正则表达式

参见使用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循环中的第二个回显行注释。

我想这就是你要找的东西吧?