Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在a中查找除锚定标记以外的所有内容<;p>;用正则表达式标记_Javascript_Regex - Fatal编程技术网

Javascript 在a中查找除锚定标记以外的所有内容<;p>;用正则表达式标记

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

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

(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工具!”(这是一个例子,但我