2016-08-23 18 views
1

ユーザーが特定のウェブサイトのコンテンツを変更できるようにするChrome拡張機能を作成しています。私は、ユーザーがワイルドカードを使用して、これらのウェブサイトを指定できるようにしたいのですが、たとえばhttp://*.google.comまたはhttp://google.com/*ワイルドカードを使用したJavascriptの一致URL - Chrome拡張子

のために私は次のコード

currentUrl = "http://google.com/"; 
matchUrl = "http://*.google.com/*"; 
match = RegExp(matchUrl.replace(/\*/g, "[^]*")).test(currentUrl); 

を見つけました。しかし、それにはいくつかの問題があります。

http://test.google.com/

http://google.com/一致する

http://test.google.com一致しない

http://.google.com/一致しない一致

解明である:

http://google.comこれは一致しません。これは本当の問題です。

どうすれば一致が正しくあるかどうかを確認するJavaScriptコードスニペットを作成できますか?このmatchUrl

matchUrl = "http://*.google.com/*"; 

+1

を参照してください

ので、この正確なmatchUrlのために、正規表現は

/^http:\/\/(?:[^\/]*\.)*google\.com(?:\/[^]*)?$/ 

のように見えるのだろうか? – melpomene

+0

最初にURLを解析して、ベース部分の '??[^ /] * \。)?'と置き換え、 '/ *'を '(?:/ [^]) *)? '。多分、特別な文字を最初にエスケープすることをお勧めします。 –

+0

正規表現は['/http:¥/\/(?:[^\/]*\.)?google\.com(?:\/[^]*)?/'](https://)にする必要があります。 regex101.com/r/jB2rK7/1)。 –

答えて

2

URLをプロトコル、ベース部分、および残りの部分に解析してから、で*を基底部分に置き換え、それ以外の場合は(?:/[^]*)?に置き換えて検証正規表現を再構築することをお勧めします。また、他のすべての特殊文字を.replace(/[?()[\]\\.+^$|]/g, "\\$&")でエスケープする必要があります。 文字列に一致するアンカー(文字列の先頭には^、文字列の最後には$)が必要です。大文字小文字を区別しない/i修飾子は、パターンの大文字小文字を区別しないようにするための単なるボーナスです。それらの結果と間違って何regex demo

var rxUrlSplit = /((?:http|ftp)s?):\/\/([^\/]+)(\/.*)?/; 
 
var strs = ['http://test.google.com/', 'http://google.com/','http://test.google.com', 'http://.google.com/','http://one.more.test.google.com']; 
 
var matchUrl = "http://*.google.com/*"; 
 
var prepUrl = ""; 
 
if ((m=matchUrl.match(rxUrlSplit)) !== null) { 
 
\t prepUrl = m[1]+"://"+m[2].replace(/[?()[\]\\.+^$|]/g, "\\$&").replace(/\*\\./g,'(?:[^/]*\\.)*').replace(/\*$/,'[^/]*'); 
 
    if (m[3]) { 
 
     prepUrl+= m[3].replace(/[?()[\]\\.+^$|]/g, "\\$&").replace(/\/\*(?=$|\/)/g, '(?:/[^]*)?'); 
 
    } 
 
} 
 
if (prepUrl) { 
 
// console.log(prepUrl); // ^http://(?:[^/]*\.)*google\.com(?:/[^]*)?$ 
 
    var rx = RegExp("^" + prepUrl + "$", "i"); 
 
    for (var s of strs) { 
 
    if (s.match(rx)) { 
 
    \t console.log(s + " matches!<br/>"); 
 
    } else { 
 
    \t console.log(s + " does not match!<br/>"); 
 
    } 
 
    } 
 
}

+1

ありがとう、それは私が探しているものです。 –

-1

RexExpはそうを持つユーザーが入力した*を交換してみてください。*正規表現の試合で

この

"http://.*.google.com/.*" 

のようなものです

thisツールを使用してテストすることができます

+0

あなたはすべての入力文字列でそれを試していません。 '。* *はオプションの'。* 'の後に* aを必要とします。 –

+0

@Wiktor私が逃したものは分かりません。 – Alberto

+0

@WiktorStribiżewが正しいです。 「http:// google.com」は一致しません –

関連する問題