Javascript:格式化字符串并避免多次替换

时间:2013-10-29 15:06:23

标签: javascript regex

我有以下字符串:

var str='
                <span class="productName">Basa fillets</span><br>
                Brand: 
                <span class="brandName">COMPLIMENTS</span><br>
                400 <abbr title="Gram" lang="en">gr</abbr>
            '

我需要得到'400'(可能是一个词,甚至是句子)。 到目前为止我所拥有的是:

d = str.replace(/<br>/g,'').replace(/<.*<\/.*>/g,'').replace(/\n/g,'').replace(/ */g,'').replace(/brand:/i,'');

它有效,但......好吧,我相信我能做得更好。我的代码中有很多类似的排队替换,我想知道如何改进,所以我更需要一个通用的答案,而不是特定的解决方案。

谢谢!

3 个答案:

答案 0 :(得分:5)

不使用字符串工具/正则表达式,而是可以在其上使用DOM方法( HTML)。

首先制作一个“假”div并将HTML添加到其中。

var str="\
                <span class=\"productName\">Basa fillets</span><br>\
                Brand: \
                <span class=\"brandName\">COMPLIMENTS</span><br>\
                400 <abbr title=\"Gram\" lang=\"en\">gr</abbr>\
            ";

var fakeDiv = document.createElement('div');
fakeDiv.innerHTML = str;

然后只使用普通的DOM遍历方法来获取所需的节点。根据您的HTML,有很多方法可以访问该元素。

var brandName = fakeDiv.getElementsByClassName('brandName');

var textNode = brandName[0].nextSibling.nextSibling;

console.log(textNode.nodeValue.trim());

DEMO:http://jsfiddle.net/aqpgV/

或者,您可以从<abbr>元素开始并向后工作。

var gram = fakeDiv.getElementsByTagName('abbr');

var textNode = gram[0].previousSibling;

console.log(textNode.nodeValue.trim());

DEMO:http://jsfiddle.net/aqpgV/1/

然而,你要遍历它取决于你: - )

答案 1 :(得分:0)

<强>正则表达式

class="brandName">[^<]+</span><br>[^\w]+([^<]+) <abbr title=

Regular expression visualization

Debuggex Demo

注意:第1组将包含您想要的项目。

答案 2 :(得分:0)

如果你想使用正则表达式,你可以做这样的事情。

    var str="\
            <span class=\"productName\">Basa fillets</span><br>\
            Brand: \
            <span class=\"brandName\">COMPLIMENTS</span><br>\
            400 <abbr title=\"Gram\" lang=\"en\">gr</abbr>\
        ";

    var myRegexp = /COMPLIMENTS<\/span><br>\W(.*?) <abbr /g;
    var match = myRegexp.exec(str);
    alert(match[1]);