我在页面上设置了几个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将保持有效且一致,我该如何获取它?
我理解这对于之前使用过正则表达式的人来说可能很容易,但对于解决方案,我会欣赏每个角色捕获的细节,以便我可以从中学习。
答案 0 :(得分:6)
相反,使用HTML解析器,然后只需读取所需<p>
块中的文本(非标记)内容。
jQuery是一个相当不错的HTML解析器,因此您可以使用以下命令将所需的文本存储在变量x
中:
var x = $('p').clone().find('a').remove().end().text();
如果你因为某种原因不能使用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();
答案 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;