[javascript] URIからドメインだけ正規表現で取得する

正規表現によるマッチング。location.hrefにmach()使ってドメイン部分を取り出す。

  • http://www.google.co.jp/ → www.google.co.jp
  • http://example.com/ → example.com
  • file:///D:/→ D
  • http://localhost/hoge/index.html → localhost
  • http://127.0.0.1:8000/ → 127.0.0.1 

※表示の都合上、全角の「?」が混じっているので注意

var str = "http://www.google.co.jp/";
var domain = str.match(/^[httpsfile]+:\/{2,3}([0-9a-z\.\-:]+?):?[0-9]*?\//i)[1];
alert(domain);

変数domainは配列になり、domain[0]にはプロトコルからドメイン後ろのスラッシュまで、
domain[1]にはドメイン部分のみが格納されます。
変数strをlocation.hrefにすると、表示しているページのURIがマッチング対象になる。

正規表現の解説

詳しい解説はとほほさんのリファレンス参照。

/^[httpsfile]+:\/{2,3}([0-9a-zA-Z\.\-:]+?):?[0-9]*?\//i

  1. //
    new RegExp()の代わりにバックスラッシュ2つ
  2. /^/
    先頭から開始する^(アクサンシルコンフレックス)記号を先頭に追加
  3. /^[httpsfile]+/
    プロトコル判別の条件を追加。http・https・ftp・fileにヒットさせるため、[](大カッコ)で文字を指定。
    カッコ内の文字いずれかが1文字以上続くので+(プラス)を後ろにつける。
  4. /^[httpsfile]+\/{2,3}/
    /(スラッシュ)は\(バックスラッシュ)をつけてエスケープしておく。
    fileの場合に3本つくので、{}(中カッコ)で2本または3本という条件を後ろにつける。
  5. /^[httpsfile]+\/{2,3}()/
    ドメイン部分だけ取得するため、()(小カッコ)で取り出す範囲を指定する。
  6. /^[httpsfile]+\/{2,3}([0-9a-zA-Z\.\-:]+?)/
    ドメインの文字は0~9、a~z、ドット、ハイフン、コロンの組み合わせなので、
    [](大カッコ)でこれらの文字を範囲指定し、後ろに+(プラス)を付ける。
    このヒットは1回だけでいいので、プラスの後に?(疑問符)もつけておく。
  7. /^[httpsfile]+\/{2,3}([0-9a-zA-Z\.\-:]+?):?[0-9]*?/
    127.0.0.1:8000の「:8000」部分があった場合にマッチする条件を追加。
    :? → コロンが1つあるかもしれないしないかもしれない
    [0-9]*? → 数字がいくつかあるかもしれないしないかもしれない
  8. /^[httpsfile]+\/{2,3}([0-9a-zA-Z\.\-:]+?):?[0-9]*?\//
    末尾に最初のバックスラッシュを追加。
  9. /^[httpsfile]+:\/{2,3}([0-9a-zA-Z\.\-:]+?):?[0-9]*?\//i
    iをつけると大文字小文字の区別をしなくなる。

「[javascript] URIからドメインだけ正規表現で取得する」への3件のフィードバック

  1. はじめまして。
    [httpsfile]+:\/{2,3}はtttt:///などにもマッチしてしまうので、正しくは(?:http:\/{2}|file:\/{3})だと思います(httpsにも対応させるのであれば、httpの部分はhttps?にする)。
    また、ドメイン部の正規表現もこのままでは日本語ドメインに対応できません。
    http://www.ietf.org/rfc/rfc3986.txt の[Page 50]に載っている正規表現を使用するほうが確実です。

    返信
  2. コメントありがとうございます。

    この記事一番の目的は、URIの正当性を検証するものではなく、location.hrefからドメイン部分を得ることなので
    プロトコルは適当でもいいか~という考えで大カッコを使っています。
    あとは厳密にすればするほど説明が面倒になる、という都合も少々。

    日本語ドメイン…そういえばそんなものもありましたねw
    全然目にしないのですっかり忘却の彼方でした。マイナー過ぎて指摘されても必要性を感じられない…

    良いサイトを教えてくださってありがとうございます。
    正規表現スキルが一つ上がった気がします…!

    返信

javascripter へ返信するコメントをキャンセル

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください