Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-正则表达式顺序不';不要紧,但必须存在_Javascript_Regex - Fatal编程技术网

JavaScript-正则表达式顺序不';不要紧,但必须存在

JavaScript-正则表达式顺序不';不要紧,但必须存在,javascript,regex,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(/&

我想从页面获取规范链接的内容。代码位于服务器上的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]);

var-metaRegex=newregexp(/只需使用两个顺序RegExp,如下所示:

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 body=''
var linkRegexp=/(]*rel=['”]canonical['”][^>]*>)/;
var hrefRegexp=/href=['”](.*?['”]/;
var linkBody=linkRegexp.exec(body)[1];
log(hrefregxp.exec(linkBody)[1]);
  • linkRegexp-使用rel='canonical'获取链接
  • hrefRegexp-从中提取href
如果只需要一个regexp,可以尝试使用替代组,并选择非空匹配项,如下所示:

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

(但依我看,这篇文章的可读性要差得多)

正确的方法是不要在HTML上使用正则表达式。更有用的是,使用HTML解析器。@AdrianWragg我不同意你的观点。正则表达式对字符串的每次解析都很有用。我的问题不是如何以不同的方式做这件事,我问的是如何检索字符串的正确部分。DOM解析器在我的情况下使用它太慢了。实际上,不,正则表达式是not“用于解析”。它只能解析最简单的语法。它是“用于匹配”。@torazaburo只是吹毛求疵。是的,这是另一种方法。一个正则表达式最好,但这也不错。谢谢
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(""));