我想从页面获取规范链接的内容。代码在服务器上的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]);
第一个表达式是 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匹配。
看起来我是否应该要求存在这两个属性并且可以对它进行分组?
正确的方法是什么?
答案 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]);
如果你只想要一个正则表达式,你可以尝试使用替代组,并选择非空匹配,如下所示:
var regexp = /<link[^>]*(?=href=['"]([^'"]*)['"][^>]*?rel=['"]canonical['"]|rel=['"]canonical[^>]*?href=['"]([^'"]*)['"])[^>]*>/;
console.log( regexp.exec(body).splice(1).join(""));
(但恕我直言,这是不太可读)