代码之家  ›  专栏  ›  技术社区  ›  Corey

使用regex在<p>标记中查找除锚标记以外的所有内容

  •  1
  • Corey  · 技术社区  · 15 年前

    我在一个页面上设置了几个HTML块,如下所示:

    <p class="something">
        <a href="http://example.com/9999">text 1 2 3</a>
        <a href="http://example.com/2346saasdf">text 3 4 5</a>
        (9999)
        <a href="http://example.com/sad3ws">text 5 6 7random</a>
    </p>
    

    我想得到括号里的数字,还有它们。我不得不承认我以前从未真正使用过regex——读过它,看过它的例子,但我自己没有使用过它。不管怎样,我做这个的时候只是环顾四周:

    <p class="something">(.*?)</p>

    正确地得到了整个 <p> 布洛克,但我还是想 (9999)

    假设页面上的其他元素也可以在括号中包含数字(但它们不会包含在这个确切的格式中),并且HTML将保持有效和一致,我如何才能得到它?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    Don't use regex to parse HTML .

    相反,使用一个HTML解析器,然后简单地读取所需的文本(非标记)内容 <p> 封锁。

    x 使用:

    var x = $('p').clone().find('a').remove().end().text();
    

    working example

    如果出于任何原因,您不能使用jQuery来简化您的生活,那么可以在DOM中使用原始JavaScript:

    var y = document.getElementsByTagName("p")[0].cloneNode(true);
    var x = "";
    for(var k in y.childNodes){ 
        if(y.childNodes[k].nodeType == 3){ 
            x += y.childNodes[k].textContent; 
        }
    }
    x = x.trim();
    

    working example

        2
  •  1
  •   Lasse V. Karlsen    15 年前

    对于大多数正则表达式引擎,括号意味着对表达式的部分进行分组,而不是对输入中的括号进行匹配。

    因此,这个(你说有点用):

    <p class="something">(.*?)</p>
                         ^   ^
                         |   |
                         +---+--- creates a group
    

    由于这个“有效”,您只需提取该组的内容,但这也会给您括号。

    我想试试这个:

    <p class="something">\((.*?)\)</p>
                         ^^     ^^
                          |     |
                          +-----+-- matches (...)
    

    然后提取第一组的内容。

    <p class="something">\((.*?)\)</p>
    
    <p class="something">                 match <p class="something">
                         \(               match (, without the \ it would be a group
                           (              create a group
                            .             match one character (usually not newlines)
                             *            ... repeated zero or more times
                              ?           ... in a non-greedy way
                               )          end the group
                                \)        match )
                                  </p>    match </p>
    
        3
  •  0
  •   z1x2    15 年前

    如果您真的想使用Regex,下面的模式可能适合您。

    var re = /<\/a>\s*([^\s]+)\s*<a /ig;