匹配范围没有一个字符与正则表达式

时间:2017-10-04 12:43:59

标签: regex regex-negation

我想创建一个正则表达式模式,捕获字符串中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.*?(?<!>).*?/>~

我错过了什么?

3 个答案:

答案 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(?:[^<]*["'][^"']*["'][^<]*)\/>