Javascript正则表达式子组

Javascript正则表达式子组,javascript,jquery,regex,regex-group,Javascript,Jquery,Regex,Regex Group,首先,不要链接到“”帖子:) 我有以下HTML,用于显示各种货币的价格,包括和不含税的价格: <span id="price_break_12345" name="1"> <span class="price"> <span class="inc" > <span class="GBP">£25.00</span> <span class="USD" styl

首先,不要链接到“”帖子:)

我有以下HTML,用于显示各种货币的价格,包括和不含税的价格:

<span id="price_break_12345" name="1">
    <span class="price">
        <span class="inc" >
            <span class="GBP">£25.00</span>
            <span class="USD" style="display:none;">$34.31</span>
            <span class="EUR" style="display:none;">27.92&nbsp;€</span>
        </span>
        <span class="ex"  style="display:none;">
            <span class="GBP">£20.83</span>
            <span class="USD" style="display:none;">$34.31</span>
            <span class="EUR" style="display:none;">23.27&nbsp;€</span>
        </span>
    </span>
    <span style="display:none" class="raw_price">25.000</span>
</span>
它为每个出现的价格中断匹配第一个价格中断一次(因此,如果存在
name=1
name=5
name=15
,它将匹配
name=1
三次


我哪里出错了?

所以,如果你能指望每个块中第一个跨距的格式如下:

<span id="price_break_12345" name="1">
function getElementChildren(parent) {
    var elements = [];
    var children = parent.childNodes;
    for (var i = 0, len = children.length; i < len; i++) {
        // collect element nodes only
        if (children[i].nodeType == 1) {
            elements.push(children[i]);
        }
    }
    return(elements);
}

var div = document.createElement("div");
div.innerHTML = str;
var priceBlocks = getElementChildren(div);
for (i = 0; i < priceBlocks.length; i++) {
    console.log(priceBlocks[i].id + ", " + priceBlocks[i].getAttribute("name") + "<br>");
}
您可以看到它在这里工作:

我使用一个转换器将三个HTML块转换成一个javascript字符串(模拟从ajax调用中得到的结果),这样我就可以在上面运行代码了


一种更可靠的方法是只使用浏览器的HTML解析器为您完成所有工作。假设您的HTML包含在名为“str”的字符串变量中,您可以像这样使用浏览器的解析器:

<span id="price_break_12345" name="1">
function getElementChildren(parent) {
    var elements = [];
    var children = parent.childNodes;
    for (var i = 0, len = children.length; i < len; i++) {
        // collect element nodes only
        if (children[i].nodeType == 1) {
            elements.push(children[i]);
        }
    }
    return(elements);
}

var div = document.createElement("div");
div.innerHTML = str;
var priceBlocks = getElementChildren(div);
for (i = 0; i < priceBlocks.length; i++) {
    console.log(priceBlocks[i].id + ", " + priceBlocks[i].getAttribute("name") + "<br>");
}
函数getElementChildren(父级){ var元素=[]; var children=parent.childNodes; for(变量i=0,len=children.length;i”; } 此处演示:


这将为这些元素提供所有DOM遍历函数,而不是在HTML上使用(有些脆弱的)正则表达式。

在很大程度上感谢jfriend让我意识到为什么我的正则表达式以一种奇怪的方式匹配(
while(price\u break=regex.exec(string))
而不是只执行一次),我已经让它工作了:

var price_regex = new RegExp(/<span[\s\S]*?name="([0-9]+)"[\s\S]*?><span[\s\S]*?>[\s\S]*?<\/span><\/span\>/gm);
var price_break;
while (price_break = price_regex.exec(strProductPrice))
{
    console && console.log(price_break);
}

它运行一次正则表达式,只返回第一个匹配项(由于
()
s,我误认为返回了第一个匹配项的3个副本)。通过循环它们,它会不断评估正则表达式,直到所有匹配项都用完为止,我假设它正常运行,类似于PHP的
preg_match

,因为它最初是这样编写的:/因为我还需要捕获它匹配的全部价格折扣(一个价格折扣是问题中HTML块的一个副本)。但是,您刚才回答了为什么它只返回第一个-我没有使用
,而
,我只是执行了一次:)我在我的答案中添加了一种新的方法,使用浏览器的HTML解析器而不是正则表达式。仅供参考,您通常不会将
/regexhere/
语法与
new Regexp()
(尽管它仍然有效)。请使用其中一种。因此,您可以将regex声明为:
var price\u regex=/[\s\s]*?/gm;
price_break = price_regex.exec(strProductPrice)