JavaScript正则表达式匹配忽略了文字点

时间:2014-07-24 02:58:16

标签: javascript regex

我试图匹配链接到具有特定扩展名的文件的页面上的所有锚点,但代码也捕获了URL以扩展名文本结尾但不包含实际扩展名的情况(没有时期)。

例如,它应该(并且确实)匹配http://example.com/image.jpg,但它也匹配http://example.com/imagejpg(我不想要它)。

使用的代码是:

var imageExtensions = "jpg|jpeg|gif|png|svg";

var allAnchors = document.getElementsByTagName("a");
for(var i = 0; i < allAnchors.length; i++) {
    var anchorWithImage = allAnchors[i];

    var matcher = new RegExp(".*\.(" + imageExtensions + ")$");
    if(matcher.test(anchorWithImage.href)) {
        alert(anchorWithImage.href);
    }
}

我认为这应该要求扩展文本位于字符串的末尾,文字句点位于扩展名之前,并且在扩展名之前可以有任何内容。我不明白为什么文字时期被忽略了。

对于真实的测试数据,我针对http://www.reddit.com/r/gifs/comments/2bis0x/holy_shit_greg/运行此脚本,并且它与http://www.reddit.com/r/makemeagif匹配,后者没有文字句号。针对this Regex tester运行这些链接会产生预期的结果。

2 个答案:

答案 0 :(得分:2)

当您使用RegExp构造函数时,您将传递一个字符串来构建正则表达式。你在表达式中逃避点的反斜杠被用作字符串中的擒纵机构。解决方案是使用双反斜杠来逃避点:

var matcher = new RegExp(".*\\.(" + imageExtensions + ")$");

现在斜杠在字符串中被转义,让它通过解析器进入RegExp构造函数以转义点。

答案 1 :(得分:0)

您的代码的另一个版本:)

var a = document.getElementsByTagName("A");
var pattern = /^(http:\/\/)?(.*)\.(jpg|jpeg|png|gif|svg)$/gi;

for(var i = 0; i < a.length; i++){
    if(a[i].href.match(pattern))
        alert(a[i].href);
}