我想创建一个正则表达式模式,捕获字符串中selfclosing html标记内的所有内容,它将在php preg_replace中使用,删除所有selfclosing标记(通常不是selfclosing,即div,span等。)来自html dom字符串。
这是一个例子。在字符串中:
'<div id="someId><div class="someClass" /></div>'
我想得到这场比赛:
'<div class="someClass" />'
但是我一直都没有比赛或者这场比赛:
'<div id="someId><div class="someClass" />'
我尝试了以下正则表达式模式及其各种组合
带点通配符且不包括“&gt;”的简单正则表达式模式:
~<div.*?[^>].*?.*?/>~
负向前瞻性正则表达式:
~<div(?!.*?>.*?)/>~
负面的背后正则表达式:
~<div.*?(?<!>).*?/>~
我错过了什么?
答案 0 :(得分:1)
改为使用解析器方法:
<?php
$html = <<<DATA
<div id="someId">
<div class="someClass" />
</div>
DATA;
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DomXPath($dom);
$divs = $xpath->query("//div[@class='someClass']");
foreach ($divs as $div) {
// do sth. useful here
}
?>
这会设置DOM
并查找有问题的div(通过xpath表达式)。
答案 1 :(得分:0)
似乎我不必要地复杂了答案:
对于我的例子,这将产生正确的结果:
~<div[^>]+?/>~
如果需要,'div'可以被捕获组替换以包含其他标记
答案 2 :(得分:0)
使用以下正则表达式:
<div[^<]*\/>
此正则表达式只检查自关闭标记内是否有<
。如果在标记内部使用<
(例如,在字符串中),这将是一个问题。
在字符串中删除<
:
<div(?:[^<]*["'][^"']*["'][^<]*)\/>