MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-survey

マッチパターンはURLのグループを指定する方法です。マッチパターンはいくつかの URL にマッチします。 マッチパターンは WebExtensions API を使う拡張機能向けに、幾つかの場所で使用されます。特にコンテンツスクリプトをロードする文書を指定するときや、 webRequest リスナーを追加する URL を指定する時に使用します。

マッチパターンを使用する API は通常マッチパターンのリストを受け取り、もしURLがパターンのいずれかにマッチしているなら適切に実行されます。たとえば manifest.json 内のcontent_scripts キーを参照して下さい。

マッチパターンの構造

全てのマッチパターンは文字列で指定します。特別な値"<all_urls>" を除き、マッチパターンは3つの部分から成り立っています。  scheme, host, pathです。 SchemeとHostの間は "://"で句切られます。

<scheme>://<host><path>

scheme

 scheme 部は2つのformのうち、どちらかを指定します。

Form マッチするもの
"*" "http"か"https"のみ
"http", "https", "file", "ftp", "app"のうちどれか1つ 指定したスキームのみ

host

host部は3つのうちどれか1つを取ります。

Form マッチするもの
"*" すべてのホスト
"*." に続くホスト名の一部分 ホスト名は指定されていますが、サブドメインはなんでもいいです。
ワイルドカード無しの完全なホスト名 そのホストのみ

"file"スキームだけは、host部はオプションです。

ワイルドカード "*" はhostの最初のみに適用できることに注意してください。

path

パス部は"/"で開始しなければいけません。

その後、ワイルドカード "*" と、URLパスとして許可される文字とを組み合わせたものが続けて入るかもしれません。ホスト部と異なり、パス部はワイルドカード "*" を途中や終わりに含むことができて、さらに2つ以上の "*" を含められます。

<all_urls>

特殊な値である "<all_urls>" は、サポートしている全てのSchemeのURL( "http", "https", "file", "ftp", "app" )にマッチします。

パターン マッチする例 マッチしない例

<all_urls>

すべての URL にマッチ

http://example.org/

ftp://files.somewhere.org/

https://a.org/some/path/

resource://a/b/c/
(サポートされていないscheme)

*://*.mozilla.org/*

"mozilla.org" かそのサブドメインでホストされているHTTP と HTTPS の URL

http://mozilla.org/

https://mozilla.org/

http://a.mozilla.org/

http://a.b.mozilla.org/

https://b.mozilla.org/path/

ftp://mozilla.org/
(マッチしないscheme)

http://mozilla.com/
(マッチしないhost)

http://firefox.org/
(マッチしないhost)

*://mozilla.org/

HTTPやHTTPSの"mozilla.org/"のホストのみマッチします。

http://mozilla.org/

https://mozilla.org/

ftp://mozilla.org/
(マッチしないscheme)

http://a.mozilla.org/
(マッチしないhost)

http://mozilla.org/a
(マッチしないpath)

ftp://mozilla.org/

"ftp://mozilla.org/"のみマッチします

ftp://mozilla.org

http://mozilla.org/
(マッチしないscheme)

ftp://sub.mozilla.org/
(マッチしないhost)

ftp://mozilla.org/path
(マッチしないpath)

https://*/path

 HTTPS URLでpathが "path"のホストのみマッチます。ホストはどんなホストでも良いです。

https://mozilla.org/path

https://a.mozilla.org/path

https://something.com/path

http://mozilla.org/path
(マッチしないscheme)

https://mozilla.org/path/
(マッチしないpath)

https://mozilla.org/a
(マッチしないpath)

https://mozilla.org/
(マッチしないpath)

https://*/path/

あらゆるホスト上の HTTPS URL で、パスが "path/" なもの

https://mozilla.org/path/

https://a.mozilla.org/path/

https://something.com/path/

http://mozilla.org/path/
(マッチしないscheme)

https://mozilla.org/path
(マッチしないpath)

https://mozilla.org/a
(マッチしないpath)

https://mozilla.org/
(マッチしないpath)

https://mozilla.org/*

HTTPS URL のみで、"mozilla.org"だけ、パスは問わない

https://mozilla.org/

https://mozilla.org/path

https://mozilla.org/another

https://mozilla.org/path/to/doc

http://mozilla.org/path
(マッチしないscheme)

https://mozilla.com/path
(マッチしないhost)

https://mozilla.org/a/b/c/

このURLのみマッチ

https://mozilla.org/a/b/c/ これ以外の全て

https://mozilla.org/*/b/*/

"mozilla.org"でホストされたHTTPS URLで、パスは中間のどこかに "b" を含むもの

https://mozilla.org/a/b/c/

https://mozilla.org/d/b/f/

https://mozilla.org/a/b/c/d/

https://mozilla.org/b/*/
(マッチしないpath)

https://mozilla.org/a/b/
(マッチしないpath)

file:///blah/*

FILE URL でパスが "blah" で始まるもの

file:///blah/

file://blah/bleh

file:///bleh/
(マッチしないpath)

無効なマッチパターン

無効なパターン 理由
resource://path/ サポートされていない scheme.
https://mozilla.org パスがない。
https://mozilla.*.org/ "*" はホストの先頭に使用する必要があります。
https://*zilla.org/ ホスト内の "*" は唯一の文字であるか、"."が続かなければいけません。
http*://mozilla.org/

scheme 内の "*" は唯一の文字であるべきです。

file://* パスが空: "file:///*"であるべき 。

マッチパターンのテスト

拡張機能を書くときには、一般にマッチパターンを直接操作することはありません。通常、マッチパターン文字列をAPIに渡し、APIはマッチパターンを作成し、URLをテストするために使用します。しかし、もしあなたがマッチパターンが動くように試行錯誤していたり、マッチパターンのデバッグをしている場合、直接的にマッチパターンを作成、テストできればとても使いやすいでしょう。このセクションではどのようにそうするのかを説明します。

注意として、ここのコードは拡張機能では動作せず、コンソールを使ったマッチパターンの自動テストに役立つためだけに提供されています。

最初に、DeveloperToolを開き、"ブラウザとアドオンのデバッグを有効"にチェックを入れます。

次に "Browser Console"を開きます:

これはあなたがコマンドラインで Firefox の特権モードの Javascript を実行することを許可します。

ブラウザconsoleで動くコードはシステムの特権モードを持つため、これを使ってコードを実行する時はいつでも、このコードがどのように動くかを正確に理解している必要があります。それはこの記事内のコードサンプルのことも含みます。

このコードをコマンドラインにペーストし、 enterを押して下さい。

Cu.import("resource://gre/modules/MatchPattern.jsm");
Cu.import("resource://gre/modules/BrowserUtils.jsm");

これは2つのことを行っています:

  •  "MatchPattern.jsm"のインポート: これはマッチパターンを実装したシステムモジュールです。特に、マッチパターンオブジェクトのコンストラクタで構成されています。 MatchPattern オブジェクトは関数 matches() を定義していて、その関数は URI を引数として取り、truefalseを返します。
  • "BrowserUtils.jsm"のインポート: これには、makeURI()関数が含まれていて、文字列を nsIURI オブジェクトに変換します。nsIURImatches() が受け取るオブジェクトのタイプです。

現在あなたは MatchPattern オブジェクトを構築し、URI を設定して、URI がマッチしているかどうかチェックすることができます。

var match = new MatchPattern("*://mozilla.org/");

var uri = BrowserUtils.makeURI("https://mozilla.org/");
match.matches(uri); //        < true

uri = BrowserUtils.makeURI("https://mozilla.org/path");
match.matches(uri); //        < false

マッチパターンを正規表現に変換する

すべてのマッチパターンは正規表現で表されます。このコードはマッチパターンを正規表現に変換します:

/**
 * Transforms a valid match pattern into a regular expression
 * which matches all URLs included by that pattern.
 *
 * @param  {string}  pattern  The pattern to transform.
 * @return {RegExp}           The pattern's equivalent as a RegExp.
 * @throws {TypeError}        If the pattern is not a valid MatchPattern
 */
function matchPatternToRegExp(pattern) {
    if (pattern === '') {
        return (/^(?:http|https|file|ftp|app):\/\//);
    }

    const schemeSegment = '(\\*|http|https|file|ftp)';
    const hostSegment = '(\\*|(?:\\*\\.)?(?:[^/*]+))?';
    const pathSegment = '(.*)';
    const matchPatternRegExp = new RegExp(
        `^${schemeSegment}://${hostSegment}/${pathSegment}$`
    );

    let match = matchPatternRegExp.exec(pattern);
    if (!match) {
         throw new TypeError(`"${pattern}" is not a valid MatchPattern`);
    }

    let [, scheme, host, path] = match;
    if (!host) {
        throw new TypeError(`"${pattern}" does not have a valid host`);
    }

    let regex = '^';

    if (scheme === '*') {
        regex += '(http|https)';
    } else {
        regex += scheme;
    }

    regex += '://';

    if (host && host === '*') {
        regex += '[^/]+?';
    } else if (host) {
        if (host.match(/^\*\./)) {
            regex += '[^/]*?';
            host = host.substring(2);
        }
        regex += host.replace(/\./g, '\\.');
    }

    if (path) {
        if (path === '*') {
            regex += '(/.*)?';
        } else if (path.charAt(0) !== '/') {
            regex += '/';
            regex += path.replace(/\./g, '\\.').replace(/\*/g, '.*?');
            regex += '/?';
        }
    }

    regex += '$';
    return new RegExp(regex);
}

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: Uemmra3, dlwe, lv7777
 最終更新者: Uemmra3,