Javascript 在a中查找除锚定标记以外的所有内容<;p>;用正则表达式标记
我在一个页面上设置了几个HTML块,如下所示:Javascript 在a中查找除锚定标记以外的所有内容<;p>;用正则表达式标记,javascript,regex,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
<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>
(9999)
我想得到括号中的数字,以及它们。我必须承认我以前从未真正使用过regex——读过它,看过它的例子,但我自己也没有使用过。不管怎样,我创建了这个,只是四处看看:
(.*)
这正确地得到了整个
块,但我只想要(9999)
(括号完整)。我真的不知道如何得到它
假设页面上的其他元素也可以有括号中的数字(但它们不会包含在这个精确的格式中),并且HTML将保持有效和一致,我如何获得它
我知道这对以前使用过正则表达式的人来说可能很容易,但对于解决方案,我希望能提供每个字符捕获的细节,以便我从中学习。
相反,使用HTML解析器,然后简单地读取所需
块中的文本(非标记)内容
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();
相反,使用HTML解析器,然后简单地读取所需
块中的文本(非标记)内容
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();
如果您真的想使用Regex,以下模式可能适合您
var re = /<\/a>\s*([^\s]+)\s*<a /ig;
var re=/\s*([^\s]+)\s*如果您真的想使用正则表达式,以下模式可能适合您
var re = /<\/a>\s*([^\s]+)\s*<a /ig;
var re=/\s*([^\s]+)\s*对于大多数正则表达式引擎,括号表示对表达式的部分进行分组,而不是在输入中匹配括号
因此,这(你说这有点起作用):
(*
^ ^
| |
+---+---创建一个组
由于这个“有效”,您可以只提取该组的内容,但这也会给您一个括号
我想试试这个:
<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>
\(.*?)
匹配
\(匹配(,没有\它将是一个组。)
(创建一个组
.匹配一个字符(通常不是换行符)
*…重复零次或多次
?以非贪婪的方式
)结束小组
\)比赛)
匹配
对于大多数正则表达式引擎,括号表示对表达式的部分进行分组,而不是在输入中匹配括号
因此,这(你说这有点起作用):
(*
^ ^
| |
+---+---创建一个组
由于这个“有效”,您可以只提取该组的内容,但这也会给您一个括号
我想试试这个:
<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>
\(.*?)
匹配
\(匹配(,没有\它将是一个组。)
(创建一个组
.匹配一个字符(通常不是换行符)
*…重复零次或多次
?以非贪婪的方式
)结束小组
\)比赛)
匹配
我以前读过这篇文章,还有杰夫在博客上的文章。如果您试图解析所有内容,那么解析[X]HTML就是个麻烦。如果这和我的情况一样,内容是有效和一致的,那么就没有什么可担心的了。仅仅因为regex可能工作的情况有限,并不意味着它是正确的工具。使用一个简单的解析器(或者只是正确地查看DOM)很可能会更短,更易于以后维护。@Tim真的吗?那很有趣。实际情况比“用正则表达式解析HTML是个魔鬼!!”或“现在你有两个问题”更有帮助。这对我来说是一种学习练习,我不想引发关于何时不使用正则表达式的争论。问题是,如此多的答案和几篇博客文章已经产生了这样的追随者,以至于任何在同一句话中包含“HTML”和“regex”的东西都是“天哪,别这样,每次无效语法破坏你的模式,你就会摧毁一个第三世界国家,杀死50只小猫!1”我完全知道HTML+regex有问题。有一件事也困扰着我:人们问“我有[x工具],我需要[y输出],我能做什么?”我看到很多“你让你的生活变得太复杂了!使用[z工具!”(这是一个例子,但我