JavaScript - 正则表达式顺序并不重要,但需要存在

时间:2016-10-27 12:02:07

标签: javascript regex

我想从页面获取规范链接的内容。代码在服务器上的Node.js中(没有DOM)。我有完整的回复(下载页面)和以下代码:

var metaRegex = new RegExp(/<link.*?href=['"](.*?)['"].*?rel=['"]canonical['"].*?>/i);
// return correctly: https://support.google.com/recaptcha/?hl=en
// var metaRegex = new RegExp(/<link(?=.*rel=['"]canonical['"])(?=.*href=['"](.*?)['"]).*?>/i);
// return incorrectly: https://www.google.com/accounts/TOS
var metaTag = metaRegex.exec(body);
console.log(metaTag[1]);

JsFiddle

第一个表达式是 rel href 属性的顺序问题。它只需要:

<link href="https://support.google.com/recaptcha/?hl=en" rel="canonical">

而不是

<link rel="canonical" href="https://support.google.com/recaptcha/?hl=en">

第二个表达式采用两种排序方式,但它与最后一次出现的href匹配。

看起来我是否应该要求存在这两个属性并且可以对它进行分组?

正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

只需使用两个连续的RegExps,就像那样:

var body = '<link rel="stylesheet" href="my.css"/> <link href="https://support.google.com/recaptcha/?hl=en" rel="canonical"/> <a href="https://www.google.com/accounts/TOS"/>'
var linkRegexp = /(<link[^>]*rel=['"]canonical['"][^>]*>)/;
var hrefRegexp = /href=['"](.*?)['"]/;

var linkBody = linkRegexp.exec(body)[1];
console.log(hrefRegexp.exec(linkBody)[1]);
  • linkRegexp - 获取与rel =&#39; canonical&#39;
  • 的链接
  • hrefRegexp - 从中​​提取href

如果你只想要一个正则表达式,你可以尝试使用替代组,并选择非空匹配,如下所示:

var regexp = /<link[^>]*(?=href=['"]([^'"]*)['"][^>]*?rel=['"]canonical['"]|rel=['"]canonical[^>]*?href=['"]([^'"]*)['"])[^>]*>/;
console.log( regexp.exec(body).splice(1).join(""));

(但恕我直言,这是不太可读)