2016-10-27 14 views
-1

標準的なリンクの内容をページから取得したいと思います。コードはサーバー上のNode.js(DOMなし)にあります。私は完全な応答(ダウンロードページ)と次のコードを持っています:JavaScript - 正規表現の順序は関係ありませんが必要です存在

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

最初の式では、relhref属性の順番で問題があります。それだけ取ります

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

とNOT

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

二式は、両方の発注がかかりますが、それはHREFの最後の出現と一致します。

私は両方の属性の存在を要求する必要があり、それをグループ化できるかのように見えますか?

正しい方法は何ですか?

+2

正しい方法は、HTMLに正規表現を使用しないことです。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

もっと便利なのは、代わりにHTMLパーサーを使用することです。 http://stackoverflow.com/questions/7977945/html-parser-on-node-js –

+0

@AdrianWragg私はあなたに同意しない。正規表現は、文字列の各解析に便利です。私の質問は違う方法でそれを行う方法ではない、私は文字列の正しい部分を取得する方法を尋ねた。私の場合、DOMパーサーは使いすぎです。 – MakoBuk

答えて

1

ちょうどその同じように、二つの連続正規表現を使用します。

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 - = '標準的な'
  • hrefRegexp RELでリンクを取得 - エキスのhrefそれ
から

regexpが1つだけの場合は、代替グループを使用して、非emptこのようなYの試合、:

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

(しかし、IMHO、これはあまり読みやすい)

+0

はい、別の方法です。 1つの正規表現が最高ですが、これは悪くありません。ありがとう – MakoBuk

関連する問題