【问题标题】:Matching range without one character with regex使用正则表达式匹配没有一个字符的范围
【发布时间】:2018-03-15 20:49:18
【问题描述】:

我想创建一个正则表达式模式,它可以捕获字符串中自闭合 html 标记中的所有内容,它将用于删除所有自闭合标记(通常不是自闭合,即 div、span 等)的 php preg_replace .) 来自 html dom 字符串。

这是一个例子。在字符串中:

'<div id="someId><div class="someClass" /></div>'

我想参加比赛:

'<div class="someClass" />'

但我一直没有匹配或这个匹配:

'<div id="someId><div class="someClass" />'

我已经尝试了以下正则表达式模式以及它们的各种组合

带有点通配符但不包括“>”的简单正则表达式:

~<div.*?[^>].*?.*?/>~

负前瞻正则表达式:

~<div(?!.*?>.*?)/>~

一个否定的正则表达式:

~<div.*?(?<!>).*?/>~

我错过了什么?

【问题讨论】:

  • &lt;div class="someClass"&gt;.*?&lt;/div&gt;
  • 以上只是一个例子,我应该更清楚一点。我已经更新了问题。

标签: regex regex-negation


【解决方案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 表达式)。

【讨论】:

  • 以上只是一个例子,我应该更清楚一点。但我不知道你上面提到的 PHP 中的那些 DOM 功能,所以谢谢你:)
【解决方案2】:

似乎我不必要地使答案复杂化:

对于我的示例,这将产生正确的结果:

~<div[^>]+?/>~

如果需要,'div' 可以被捕获组替换以包含其他标签

【讨论】:

    【解决方案3】:

    使用以下正则表达式:

    <div[^<]*\/>
    

    这个正则表达式只是检查自闭标签内没有&lt;。如果在标签内(例如在字符串中)使用&lt;,这将是一个问题。

    要在字符串中排除&lt;

    <div(?:[^<]*["'][^"']*["'][^<]*)\/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多