0

我正在开发一个 javascript 小书签,它将通过并在网页上查找所有带有看起来像货币的文本的元素。然后对于每个元素,我会找到它的字体大小并确定它是否有直通。价格和字体大小被推入一个数组。

我已经整理了下面的代码,但我不确定它是否是最有效的。比赛也有错误。理想情况下,我希望能够直接磨练那些与正则表达式匹配的元素。

var ele = b.getElementsByTagName('*');
for(i=0; i<ele.length; i++) {
    //check iff innerhtml matches
    if(ele[i].innerHTML.match(/[$€£]\d{1,3}(,?\d{3})?(\.\d{2})?/g)) {
        var price = ele[i].innerHTML;
        var size = ele[i].style.fontSize;
        var lineThrough = ele[i].style.textDecoration;
        if(lineThrough != 'line-through' && price && size) {
            results.push({ size: size, price: price});
        }
    }
}

由于某种原因,匹配似乎不完全匹配。

4

1 回答 1

1

首先,如果您想匹配大于 999,999.99 的总和,则正则表达式应该是:[$€£](\d{1,3})(,?\d{3})*(\.\d{2})?。在这里我改为?表示*“0或更多”,当“?” 意思是“零或一”。

如果您想找到一个没有以严格格式书写的价格(例如 30 000 000 美元),那么您可能需要为“可能”的空间添加入场费:[$€£]\s*(\d{1,3})\s*(,?\d{3}\s*)*(\.\d{2})?.

Objectstyle仅包含直接为此元素指定的样式,但不包含继承的样式。要访问继承的样式,请使用window.getComputedStyle.

innerHTML属性返回所有嵌套节点的内容,因此您的函数将找到您要查找的元素的所有父元素。要查找当前节点文本,firstChild如果此属性是,我使用属性instance of Text(但我相信有一个更优雅的解决方案):

var ele = document.getElementsByTagName('*');
results = [];

for (i = 0; i < ele.length; i++)
{
    var el = ele[i];
    if (el.hasChildNodes && el.firstChild instanceof Text)
    {
        var price = el.firstChild.textContent.match(/([$€£]+)\s*(\d{1,3})\s*(,?\d{3}\s*)*(\.\d{2})?/g);
        if (price)
        {
            var style = window.getComputedStyle ? window.getComputedStyle(el) : el.style;
            var size = style.fontSize;
            var lineThrough = style.textDecoration;
            if (lineThrough != 'line-through' && price && size)
            {
                results.push({ size: size, price: price});
            }
        }
    }
}

如果您想查找包含缩写的金额,您可以将您的正则表达式扩展为:/([$€£]+)\s*(\d{1,3})\s*(,?\d{3}\s*)*(\.\d{2})?(\s*[K|M|MM|B|thousand|million|billion])*/g.

于 2013-04-26T06:26:33.063 回答