繁体   English   中英

使用Singleline从正则表达式中的HTML获取所有匹配项

[英]Get all matches from Html in Regex with Singleline

我在从此字符串检测所有匹配项时遇到问题。 我想要的是从<p><[CDATA[<!--....-->]]></p>获得“所有”匹配项

这是我的样本HTML

<div class="row">
    <div class="twelve columns">
<p>
    <![CDATA[<!--@ControlViewHelper.ExpandableArea(Message.F_CMNG1010(), @<text>
@ControlViewHelper.TextArea(Message.CMNL_USER(), "userid", ""))-->]]>
<p>
    <![CDATA[<!--@ControlViewHelper.ExpandableArea(Message.CMNL_PASSWORD(), @<text>
</text>)-->]]>
</p>
<p>
    <![CDATA[<!--@ControlViewHelper.ExpandableArea(null, @<text>

</text>)-->]]>
</p>
<p>
    <![CDATA[<!--@ControlViewHelper.ExpandableArea(null, @<text>

</text>)-->]]>
</p>

    </div>
</div>

这是我当前使用SingleLine和Global激活的正则表达式

<p>[\r*\n*\t*\s*]*<!\[CDATA\[<!--(.*)-->\]\]>[\r*\n*\t*\s*]*<\/p>

结果始终只有一个 ,因为它检测到第一个<p>和最后一个</p>


新问题,似乎是一个非贪婪的标记解决了它,现在我有了这个正则表达式。

<p>[\r*\n*\t*\s*]*<!\[CDATA\[(.*?)\]\]>[\r*\n*\t*\s*]<\/p>

但这在此html上失败。

<p>
    <![CDATA[@ControlViewHelper.ExpandableArea(Message.F_CMNG1010(), @<text>
    <p><![CDATA[@ControlViewHelper.TextArea(Message.CMNL_USER(), "userid",
    "")]]></p> </text>)]]>
</p>
<p>
    <![CDATA[@ControlViewHelper.ExpandableArea(Message.CMNL_PASSWORD(), @<text>
    <p><![CDATA[@ControlViewHelper.ExpandableArea(Message.CMNL_PASSWORD(), @<text>TEMPORARY
    CODE: Support for inline html as parameters not yet
    implemented.</text>)]]><p><![CDATA[@ControlViewHelper.TextBox(null,
    "KceQOpKT")]]></p><p><![CDATA[@ControlViewHelper.TextBox(null,
    "FYkeojGu")]]></p><p><![CDATA[@ControlViewHelper.TextBox(Message.CMNL_PASSCHECK(),
    "qCpXFoIX")]]></p></p> </text>)]]>
</p>
<p>
    <![CDATA[@ControlViewHelper.ExpandableArea(null, @<text> </text>)]]>
</p>
<p>
    <![CDATA[@ControlViewHelper.ExpandableArea(null, @<text> </text>)]]>
</p>

没有[\\r*\\n*\\t*\\s*]它无法检测到CDATA

我建议尝试遵循正则表达式。 注意:正则表达式的语法高度依赖于所使用的语言。 例如

在PHP和javascript中:

/<p>\s*<!\[CDATA\[(?:<!--)?([\S\s]*?)(?:-->)?\]\]>\s*<\/p>/gi

在C#中:

var htmlString = ""; // your html goes here
var result = null;

var regexObj = new Regex(@"<p>.*?<!\[CDATA\[(?:<!--)?(.*?)(?:-->)?\]\]>.*?<\/p>", 
               RegexOptions.IgnoreCase | RegexOptions.Singleline);

result = regexObj.Match(htmlString).Value;

上面的正则表达式将找到<p><[CDATA[<!--....-->]]></p> 它可能包含嵌入式/嵌套<p><[CDATA[<!--....-->]]></p>但是您可以再次使用上述正则表达式轻松检查/删除。

参见演示: https//regex101.com/r/nU4eZ4/4

暂无
暂无

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

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