使用正则表达式</p>在<p>标记内找到除锚标记之外的所有内容

时间:2010-10-31 03:06:33

标签: javascript regex

我在页面上设置了几个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>

我希望得到括号中的数字。我不得不承认我之前从未真正使用过正则表达式 - 阅读它,看过它的例子但是我自己没有使用它。无论如何,我通过一些环顾四周创建了这个:

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

这正确地获取了整个<p>块,但同样,我只想要(9999)(括号完整)。我真的不确定如何得到它。

假设页面上的其他元素也可能在括号中有数字(但它们不会包含在这种格式中),并且HTML将保持有效且一致,我该如何获取它?

我理解这对于之前使用过正则表达式的人来说可能很容易,但对于解决方案,我会欣赏每个角色捕获的细节,以便我可以从中学习。

3 个答案:

答案 0 :(得分:6)

Don't use regex to parse HTML

相反,使用HTML解析器,然后只需读取所需<p>块中的文本(非标记)内容。

jQuery是一个相当不错的HTML解析器,因此您可以使用以下命令将所需的文本存储在变量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

答案 1 :(得分:1)

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

因此,这(你说有点工作):

<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>

答案 2 :(得分:0)

如果您真的想使用Regex,以下模式可能对您有用。

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