嵌套标签的正则表达式(最内层使其更容易)

时间:2010-06-19 16:17:47

标签: html regex tags nested

我对此进行了相当多的研究,但是找不到一个如何匹配嵌套的html标签属性的工作示例。我知道可以在没有属性的情况下匹配平衡/嵌套的最内层标签(例如正则表达式为#<div\b[^>]*>(?:(?> [^<]+ ) |<(?!div\b[^>]*>))*?</div>#x)。

但是,我希望看到一个正则表达式模式,它找到一个带有属性的html标记对。

示例:它基本上应匹配

<div class="aaa"> **<div class="aaa">** <div> <div> </div> **</div>** </div>

而不是

<div class="aaa"> **<div class="aaa">** <div> <div> **</div>** </div> </div>

有人有想法吗?

出于测试目的,我们可以使用:http://www.lumadis.be/regex/test_regex.php


PS。史蒂文在他的博客中提到了一个解决方案(实际上是在评论中),但它不起作用

http://blog.stevenlevithan.com/archives/match-innermost-html-element

$regex = '/<div\b[^>]+?\bid\s*=\s*"MyID"[^>]*>(?:((?:[^<]++|<(?!\/?div\b[^>]*>))+)|(<div\b[^>]*>(?>(?1)|(?2))*<\/div>))?<\/div>/i';

4 个答案:

答案 0 :(得分:2)

RegEx match open tags except XHTML self-contained tags

事实上,这绝对是不可能的。 HTML有一些独特的,神奇的东西,它不受RegEx的影响。

答案 1 :(得分:2)

我构建了一个简短的python脚本来解决管理嵌套标签的问题。它与html和其他可怕的嵌套语法一样快乐地运行,作为维基代码。我是为了避免正则表达式而编写的!我根本无法理解它们。 :-(。我把这个函数用于任何东西,它对html和xml运行得非常好。它也很快,因为它只使用基本的字符串搜索。我很高兴知道正则表达式无法帮助。:-) < / p>

如果你们有兴趣的话,我想分享这个剧本;但请注意,我不是程序员,我认为这个问题已经解决了很长时间了!

你可以在我的谈话页面找到我。来源:http://it.wikisource.org/wiki/Discussioni_utente:Alex_brollo

答案 2 :(得分:2)

匹配<div>&amp;的最内部匹配对</div>代码及其属性&amp;含量:

#<div(?:(?!(<div|</div>)).)*</div>#s

这里的关键是(?:(?!STRING).)*是字符串,[^CHAR]*是字符。

信用:https://stackoverflow.com/a/6996274

PHP中的示例:

<?php

$text = <<<'EOD'
<div id="1">
  in 1
  <div id="2">
    in 2
    <div id="3">
      in 3
    </div>
  </div>
</div>
<div id="4">
  in 4
  <div id="5">
    in 5
  </div>
</div>
EOD;

$matches = array();
preg_match_all('#<div(?:(?!(<div|</div>)).)*</div>#s', $text, $matches);

foreach ($matches[0] as $index => $match) {
  echo "************" . "\n" . $match . "\n";
}

输出:

************
<div id="3">
      in 3
    </div>
************
<div id="5">
    in 5
  </div>

答案 3 :(得分:0)

您可以使用相同的正则表达式来递归地执行此操作,但需要时执行。像这样:

function htmlToPlainText(html) {
    let text = html || ''

    // as there is html nested inside some html attributes, we need a recursive strategy to clean up the html
    while (text !== (text = text.replace(/<[^<>]*>/g, '')));

    return text
  }

这适用于以下情况:

<p data-attr="<span>Oh!</span>">Lorem Ipsum</p>

我在这里找到此脚本:http://blog.stevenlevithan.com/archives/reverse-recursive-pattern