URLの一部を取得する(正規表現)


132

指定されたURL(単一行):http :
//test.example.com/dir/subdir/file.html

正規表現を使用して次の部分を抽出するにはどうすればよいですか。

  1. サブドメイン(テスト)
  2. ドメイン(example.com)
  3. ファイルなしのパス(/ dir / subdir /)
  4. ファイル(file.html)
  5. ファイルのパス(/dir/subdir/file.html)
  6. パスなしのURL(http://test.example.com
  7. (あなたが便利だと思うものを追加してください)

次のURLを入力しても、正規表現は正しく機能するはずです。

http://example.example.com/example/example/example.html

これは直接的な答えではありませんが、ほとんどのWebライブラリには、このタスクを実行する関数があります。この関数はしばしばに似たものと呼ばれCrackUrlます。そのような関数が存在する場合は、それを使用して、手作りのコードよりも信頼性が高く効率的であることがほぼ保証されています。
Konrad Rudolph、

7
これを正規表現で行う必要がある理由を説明してください。それが宿題の場合、それはあなたの制約だからです。それ以外の場合は、正規表現を使用するよりも言語固有の解決策があります。
アンディレスター

1
最初と最後のサンプルへのリンクが壊れています。
ティンマン

ここでは、スキーム、ドメイン、TLD、ポートおよびクエリパスを抽出する方法を見つけることができます:stackoverflow.com/questions/9760588/...
パオロRovelli

回答:


151

クエリパラメータとアンカーを含む完全なURLを解析および分割する単一の正規表現

https://www.google.com/dir/1/2/search.html?arg=0-a&arg1=1-b&arg3-c#hash

^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$

RexExポジション:

url:RegExp ['$&']、

protocol:RegExp。$ 2、

host:RegExp。$ 3、

パス:RegExp。$ 4、

ファイル:RegExp。$ 6、

query:RegExp。$ 7、

ハッシュ:RegExp。$ 8

その後、ホスト( '。'区切り)をさらに簡単に解析できます。

何を私がするだろうことは、このような使用のものです:

/*
    ^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$
*/
proto $1
host $2
port $3
the-rest $4

さらに「残りの部分」を解析して、できるだけ具体的にします。1つの正規表現でそれを行うのは、まあ、少しクレイジーです。


4
リンクcodesnippets.joyent.com/posts/show/523は、10月20日の時点では機能しません
W3Max

19
問題はこの部分です(.*)?。Kleeneスターはすでに0以上を受け入れているため、?部分(0または1)はそれを混乱させています。に変更(.*)?して修正しました(.+)?。削除することもできます?
rossipedia

3
こんにちはDVEが、私はそれがもう少し抽出するために改良されてきたexample.comのようなURLからhttp://www.example.com:8080/....ここに行く:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
mnacos

4
そして何の正規表現は、ここで、完璧ではないことの証明は、1つのすぐに訂正があります:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
mnacos

2
私は、URL(改良版)のすべての部分を識別するために、この正規表現を修正-コードをPythonで ^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))? code あなたは上のアクションで、このコードを表示pythex.org
arannasousa

81

私はパーティーに遅れていると思いますが、正規表現なしでブラウザにURLを解析させる簡単な方法があります:

var a = document.createElement('a');
a.href = 'http://www.example.com:123/foo/bar.html?fox=trot#foo';

['href','protocol','host','hostname','port','pathname','search','hash'].forEach(function(k) {
    console.log(k+':', a[k]);
});

/*//Output:
href: http://www.example.com:123/foo/bar.html?fox=trot#foo
protocol: http:
host: www.example.com:123
hostname: www.example.com
port: 123
pathname: /foo/bar.html
search: ?fox=trot
hash: #foo
*/

9
元の質問に「言語にとらわれない」というタグが付けられていたとしたら、これはどの言語ですか?
MarkHu 2014

このソリューションでは、http://プロトコル、ホスト、ホスト名のプロパティを正しく表示するために、たとえば、プロトコルプレフィックスの存在が必要です。それ以外の場合、最初のスラッシュがプロトコルプロパティに移動するまでのURLの始まり。
Oleksii Aza 2014

これは単純ですが、RegEx解析よりもはるかに遅いと思います。
demisx 2015

すべてのブラウザでサポートされていますか?
2015年

1
私たちがこのように進んでいる場合、あなたも行うことができますvar url = new URL(someUrl)
gman

67

私はパーティーに数年遅れていますが、Uniform Resource Identifier仕様に正規表現を使用したURIの解析に関するセクションがあることに誰も言及していないことに驚いています。Berners-Lee等によって書かれた正規表現は次のとおりです。

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 12            3  4          5       6  7        8 9

上記の2行目の数値は、読みやすくするためのものです。それらは、各部分式(つまり、各対の括弧)の参照点を示します。部分式に一致する値を$と呼びます。たとえば、上記の式を

http://www.ics.uci.edu/pub/ietf/uri/#Related

次の部分式が一致します。

$1 = http:
$2 = http
$3 = //www.ics.uci.edu
$4 = www.ics.uci.edu
$5 = /pub/ietf/uri/
$6 = <undefined>
$7 = <undefined>
$8 = #Related
$9 = Related

それだけの価値があるため、JavaScriptでスラッシュをエスケープする必要があることがわかりました。

^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?


4
すばらしい答えです!RFCから何かを選択しても、間違いなく悪いことをすることはできません
フランクスター

1
これは、クエリパラメータを解析しません
レミーDAVID

2
これは最高のものです。特に、これは私が他の人に見た2つの問題に対処します。1:これは、ftp://およびなどの他のプロトコルを正しく処理しますmailto://2:これはと正しく扱うusernamepassword。これらのオプションのフィールドは、ホスト名とポートのようにコロンで区切られており、私が見た他のほとんどの正規表現をつまずきます。@RémyDAVIDクエリ文字列も、ブラウザlocationオブジェクトによって正常に解析されません。クエリ文字列を解析する必要がある場合は、その小さなライブラリであるuqsを確認してください
Stijn de Witt 2017

2
この回答はほとんどすべてのプロトコルをカバーしているため、より多くの賛成票を投じる価値があります。
Tianzhen Lin

1
プロトコルがユーザー名/パスワード(難解で技術的に無効な構文、私は認める)で暗黙のHTTPである場合、それは壊れます:たとえばuser:pass@example.com-RFC 3986は言う:A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.
Matt Chambers

33

投票数の多い回答(hometoastの回答)が完全に機能しないことがわかりました。2つの問題:

  1. ポート番号は扱えません。
  2. ハッシュ部分が壊れています。

以下は修正バージョンです。

^((http[s]?|ftp):\/)?\/?([^:\/\s]+)(:([^\/]*))?((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?$

パーツの位置は次のとおりです。

int SCHEMA = 2, DOMAIN = 3, PORT = 5, PATH = 6, FILE = 8, QUERYSTRING = 9, HASH = 12

anonユーザーが投稿した編集:

function getFileName(path) {
    return path.match(/^((http[s]?|ftp):\/)?\/?([^:\/\s]+)(:([^\/]*))?((\/[\w\/-]+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?$/i)[8];
}

1
URLがドメインの後にパスを持たないhttp://www.example.com場合、またはパスがのような単一の文字である場合、機能しないことに注意してくださいhttp://www.example.com/a
フェルナンドコレイア2017年

11

すべてのURLに一致する正規表現が必要で、これを作成しました:

/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*)\.(?=[^\.\/\:]*\.[^\.\/\:]*))?([^\.\/\:]*)(?:\.([^\/\.\:]*))?(?:\:([0-9]*))?(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/

すべてのURL、任意のプロトコル、次のようなURLにも一致します

ftp://user:pass@www.cs.server.com:8080/dir1/dir2/file.php?param1=value1#hashtag

結果(JavaScript)は次のようになります。

["ftp", "user", "pass", "www.cs", "server", "com", "8080", "/dir1/dir2/", "file.php", "param1=value1", "hashtag"]

のようなURL

mailto://admin@www.cs.server.com

このようになります:

["mailto", "admin", undefined, "www.cs", "server", "com", undefined, undefined, undefined, undefined, undefined] 

3
あなたは全体のドメイン/ IPアドレスと一致する場合(ドットで区切られていない)、このいずれかを使用します/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
レペ

11

私はこれをjavascriptで解決しようとしていました、それは以下によって処理されるべきです:

var url = new URL('http://a:b@example.com:890/path/wah@t/foo.js?foo=bar&bingobang=&king=kong@kong.com#foobar/bing/bo@ng?bang');

(少なくともChromeでは)それは次のように解析されます:

{
  "hash": "#foobar/bing/bo@ng?bang",
  "search": "?foo=bar&bingobang=&king=kong@kong.com",
  "pathname": "/path/wah@t/foo.js",
  "port": "890",
  "hostname": "example.com",
  "host": "example.com:890",
  "password": "b",
  "username": "a",
  "protocol": "http:",
  "origin": "http://example.com:890",
  "href": "http://a:b@example.com:890/path/wah@t/foo.js?foo=bar&bingobang=&king=kong@kong.com#foobar/bing/bo@ng?bang"
}

ただし、これはクロスブラウザーではないため(https://developer.mozilla.org/en-US/docs/Web/API/URL)、これを組み合わせて上記と同じ部分を引き出します。

^(?:(?:(([^:\/#\?]+:)?(?:(?:\/\/)(?:(?:(?:([^:@\/#\?]+)(?:\:([^:@\/#\?]*))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((?:\/?(?:[^\/\?#]+\/+)*)(?:[^\?#]*)))?(\?[^#]+)?)(#.*)?

この正規表現のためのクレジットに行くhttps://gist.github.com/rpflorence jsperf投稿者http://jsperf.com/url-parsing:(本来はここで見つけるhttps://gist.github.com/jlong​​/2428561 #comment-310066)これはもともと基づいていた正規表現を思いついた人。

パーツは次の順序です。

var keys = [
    "href",                    // http://user:pass@host.com:81/directory/file.ext?query=1#anchor
    "origin",                  // http://user:pass@host.com:81
    "protocol",                // http:
    "username",                // user
    "password",                // pass
    "host",                    // host.com:81
    "hostname",                // host.com
    "port",                    // 81
    "pathname",                // /directory/file.ext
    "search",                  // ?query=1
    "hash"                     // #anchor
];

それをラップし、クエリパラメータを提供する小さなライブラリもあります。

https://github.com/sadams/lite-url(bowerでも利用可能)

改善がある場合は、より多くのテストを含むプルリクエストを作成してください。同意し​​て感謝します。


これは素晴らしいことですが、実際には、重複したホストであるホスト名の代わりにサブドメインを引き出すこのようなバージョンでうまくいく可能性があります。だから、もし私がhttp://test1.dev.mydomain.com/例えば持っていたら、それは引き出されるでしょうtest1.dev.
Lankymart 2014

これは非常にうまく機能します。異常な認証パラメーターをURLから抽出する方法を探していましたが、これは美しく機能します。
アーロンM

6

より読みやすいソリューションを提案します(Pythonでは、すべての正規表現に適用されます)。

def url_path_to_dict(path):
    pattern = (r'^'
               r'((?P<schema>.+?)://)?'
               r'((?P<user>.+?)(:(?P<password>.*?))?@)?'
               r'(?P<host>.*?)'
               r'(:(?P<port>\d+?))?'
               r'(?P<path>/.*?)?'
               r'(?P<query>[?].*?)?'
               r'$'
               )
    regex = re.compile(pattern)
    m = regex.match(path)
    d = m.groupdict() if m is not None else None

    return d

def main():
    print url_path_to_dict('http://example.example.com/example/example/example.html')

プリント:

{
'host': 'example.example.com', 
'user': None, 
'path': '/example/example/example.html', 
'query': None, 
'password': None, 
'port': None, 
'schema': 'http'
}

5

サブドメインとドメインは難しいです。サブドメインはいくつかの部分を持つことができ、トップレベルドメインhttp://sub1.sub2.domain.co.uk/も同様です。

 the path without the file : http://[^/]+/((?:[^/]+/)*(?:[^/]+$)?)  
 the file : http://[^/]+/(?:[^/]+/)*((?:[^/.]+\.)+[^/.]+)$  
 the path with the file : http://[^/]+/(.*)  
 the URL without the path : (http://[^/]+/)  

(Markdownは正規表現にあまり友好的ではありません)


2
非常に便利(http(s?)://[^/]+/)
-httpsを

5

この改善されたバージョンは、パーサーと同じくらい確実に機能するはずです。

   // Applies to URI, not just URL or URN:
   //    http://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Relationship_to_URL_and_URN
   //
   // http://labs.apache.org/webarch/uri/rfc/rfc3986.html#regexp
   //
   // (?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?
   //
   // http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax
   //
   // $@ matches the entire uri
   // $1 matches scheme (ftp, http, mailto, mshelp, ymsgr, etc)
   // $2 matches authority (host, user:pwd@host, etc)
   // $3 matches path
   // $4 matches query (http GET REST api, etc)
   // $5 matches fragment (html anchor, etc)
   //
   // Match specific schemes, non-optional authority, disallow white-space so can delimit in text, and allow 'www.' w/o scheme
   // Note the schemes must match ^[^\s|:/?#]+(?:\|[^\s|:/?#]+)*$
   //
   // (?:()(www\.[^\s/?#]+\.[^\s/?#]+)|(schemes)://([^\s/?#]*))([^\s?#]*)(?:\?([^\s#]*))?(#(\S*))?
   //
   // Validate the authority with an orthogonal RegExp, so the RegExp above won’t fail to match any valid urls.
   function uriRegExp( flags, schemes/* = null*/, noSubMatches/* = false*/ )
   {
      if( !schemes )
         schemes = '[^\\s:\/?#]+'
      else if( !RegExp( /^[^\s|:\/?#]+(?:\|[^\s|:\/?#]+)*$/ ).test( schemes ) )
         throw TypeError( 'expected URI schemes' )
      return noSubMatches ? new RegExp( '(?:www\\.[^\\s/?#]+\\.[^\\s/?#]+|' + schemes + '://[^\\s/?#]*)[^\\s?#]*(?:\\?[^\\s#]*)?(?:#\\S*)?', flags ) :
         new RegExp( '(?:()(www\\.[^\\s/?#]+\\.[^\\s/?#]+)|(' + schemes + ')://([^\\s/?#]*))([^\\s?#]*)(?:\\?([^\\s#]*))?(?:#(\\S*))?', flags )
   }

   // http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes
   function uriSchemesRegExp()
   {
      return 'about|callto|ftp|gtalk|http|https|irc|ircs|javascript|mailto|mshelp|sftp|ssh|steam|tel|view-source|ymsgr'
   }


4
/^((?P<scheme>https?|ftp):\/)?\/?((?P<username>.*?)(:(?P<password>.*?)|)@)?(?P<hostname>[^:\/\s]+)(?P<port>:([^\/]*))?(?P<path>(\/\w+)*\/)(?P<filename>[-\w.]+[^#?\s]*)?(?P<query>\?([^#]*))?(?P<fragment>#(.*))?$/

同様の質問に対する私の回答から。いくつかのバグ(ユーザー名/パスワードをサポートしていない、単一文字のファイル名をサポートしていない、フラグメント識別子が壊れているなど)があったため、他のいくつかよりもうまく機能します。


2

.NETのUriオブジェクトを使用して、すべてのhttp / https、ホスト、ポート、パス、およびクエリを取得できます。ただ難しいのは、ホストをサブドメイン、ドメイン名、TLDに分割することです。

そのための標準はなく、文字列解析またはRegExを使用して正しい結果を生成することはできません。最初はRegEx関数を使用していますが、すべてのURLがサブドメインを正しく解析できるわけではありません。実際の方法は、TLDのリストを使用することです。URLのTLDが定義された後、左側はドメインで、残りはサブドメインです。

ただし、新しいTLDが可能であるため、リストはそれを維持する必要があります。私が知っている現時点ではpublicsuffix.orgが最新のリストを維持しており、Googleコードのドメイン名パーサーツールを使用してパブリックサフィックスリストを解析し、DomainNameオブジェクトを使用してサブドメイン、ドメイン、TLDを簡単に取得できます:domainName.SubDomain、domainName .DomainおよびdomainName.TLD。

この回答も役に立ちます: URLからサブドメインを取得する

コールミーラン


2

これは完全なものであり、どのプロトコルにも依存していません。

function getServerURL(url) {
        var m = url.match("(^(?:(?:.*?)?//)?[^/?#;]*)");
        console.log(m[1]) // Remove this
        return m[1];
    }

getServerURL("http://dev.test.se")
getServerURL("http://dev.test.se/")
getServerURL("//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js")
getServerURL("//")
getServerURL("www.dev.test.se/sdas/dsads")
getServerURL("www.dev.test.se/")
getServerURL("www.dev.test.se?abc=32")
getServerURL("www.dev.test.se#abc")
getServerURL("//dev.test.se?sads")
getServerURL("http://www.dev.test.se#321")
getServerURL("http://localhost:8080/sads")
getServerURL("https://localhost:8080?sdsa")

プリント

http://dev.test.se

http://dev.test.se

//ajax.googleapis.com

//

www.dev.test.se

www.dev.test.se

www.dev.test.se

www.dev.test.se

//dev.test.se

http://www.dev.test.se

http://localhost:8080

https://localhost:8080

2

上記のどれもうまくいきませんでした。これが私が最終的に使用したものです:

/^(?:((?:https?|s?ftp):)\/\/)([^:\/\s]+)(?::(\d*))?(?:\/([^\s?#]+)?([?][^?#]*)?(#.*)?)?/

2

「Javascript:The Good Parts」に掲載された正規表現が好きです。短すぎず、複雑すぎません。githubのこのページには、それを使用するJavaScriptコードもあります。しかし、それはあらゆる言語に適応することができます。 https://gist.github.com/voodooGQ/4057330


1

Javaはこれを行うURLクラスを提供します。 クエリURLオブジェクト。

余談ですが、PHPはparse_url()を提供しています。


これはサブドメインを解析しないようですが?
Chris Dutrow、2010年

アスカーは正規表現を求めました。URLクラスは、作成時に接続を開きます。
MikeNereson

「URLクラスは、作成時に接続を開きます」-これは、connect()などのメソッドを呼び出す場合にのみ正しくありません。しかし、java.net.URLが多少重いことは事実です。この使用例では、java.net.URIの方が適しています。
jcsahnwaldtがモニカを復活させる

1

正規表現を使用しないことをお勧めします。WinHttpCrackUrl()などのAPI呼び出しは、エラーが発生しにくくなります。

http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx


5
また、プラットフォーム固有です。
Andir

2
重要なのは、ホイールを再発明するのではなく、ライブラリを使用することでした。Ruby、Python、Perlには、URLを切り離すためのツールがあり、不正なパターンを実装する代わりにURLを取得します。
Tin Man

1

私は私のニーズをカバーしないこれらのいくつかを試しました、特にパスなしでURLをキャッチしなかった最高の投票(http://example.com/

また、グループ名の欠如は、それをansibleで使用できなくしました(または、おそらく私のjinja2スキルが欠如しています)。

これは少し変更された私のバージョンで、ソースはここで最も投票されたバージョンです:

^((?P<protocol>http[s]?|ftp):\/)?\/?(?P<host>[^:\/\s]+)(?P<path>((\/\w+)*\/)([\w\-\.]+[^#?\s]+))*(.*)?(#[\w\-]+)?$

0

http://www.fileformat.info/tool/regex.htmを使用する hometoastの正規表現うまくいき。

しかし、ここでの取り決めです。プログラムのさまざまな状況でさまざまな正規表現パターンを使用したいのです。

たとえば、私にはこのURLがあり、プログラムでサポートされているすべてのURLを列挙する列挙があります。列挙内の各オブジェクトには、正規表現パターンを返すメソッドgetRegexPatternがあり、URLとの比較に使用されます。特定の正規表現パターンがtrueを返す場合、このURLは私のプログラムでサポートされていることがわかります。したがって、各列挙には、URL内のどこを見ればよいかによって、独自の正規表現があります。

Hometoastの提案は素晴らしいですが、私の場合、それは役に立たないと思います(すべての列挙で同じ正規表現をコピーして貼り付けない限り)。

そのため、状況ごとに正規表現を個別に与える答えを求めていました。ホームトーストの場合は+1ですが。;)


0

私はあなたがこれに言語に依存しないと主張しているのを知っていますが、あなたが何を使っているのか教えていただけますか?

非キャプチャー一致の機能がある場合は、hometoastの式を変更して、キャプチャーに関係のないサブ式を次のように設定できます。

(?:SOMESTUFF)

正規表現を複数の場所にコピーして貼り付ける(わずかに変更する)必要がありますが、これは理にかなっています-部分式が存在するかどうかを確認するだけでなく、URLの一部として存在するかどうかを確認します。サブ式に非キャプチャー修飾子を使用すると、必要なものが得られますが、それ以上のものはありません。

ほんの少しのメモと同じように、hometoastの式では、「https」の「s」を括弧で囲む必要はありません。量指定子は、それらの直前の1つの文字(または文字クラスまたは部分式)を数量化します。そう:

https?

「http」または「https」と一致します。


0

ファイルなしでURLパスを取得する正規表現。

url = ' http:// domain / dir1 / dir2 / somefile ' url.scan(/ ^(http:// [^ /] +)((?:/ [^ /] +)+(?= /)) ?/?(?:[^ /] +)?$ / i).to_s

このURLへの相対パスを追加するのに役立ちます。


0

完全な解析を行う正規表現は非常に恐ろしいものです。読みやすいように名前付きの後方参照を含め、各部分を別々の行に分割しましたが、それでも次のようになります。

^(?:(?P<protocol>\w+(?=:\/\/))(?::\/\/))?
(?:(?P<host>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^\/?#:]+)(?::(?P<port>[0-9]+))?)\/)?
(?:(?P<path>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)\/)?
(?P<file>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)
(?:\?(?P<querystring>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^#])+))?
(?:#(?P<fragment>.*))?$

非常に冗長である必要があるのは、プロトコルまたはポートを除いて、どの部分にもHTMLエンティティを含めることができるため、フラグメントの描写が非常に難しいことです。だから、最後のいくつかのケースで-ホスト、パス、ファイル、クエリ文字列、およびフラグメント、我々は、任意のHTMLエンティティまたはではない任意の文字のいずれかが可能?かを#。HTMLエンティティの正規表現は次のようになります。

$htmlentity = "&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);"

それが抽出されると(口ひげの構文を使用して表現しました)、少し読みやすくなります。

^(?:(?P<protocol>(?:ht|f)tps?|\w+(?=:\/\/))(?::\/\/))?
(?:(?P<host>(?:{{htmlentity}}|[^\/?#:])+(?::(?P<port>[0-9]+))?)\/)?
(?:(?P<path>(?:{{htmlentity}}|[^?#])+)\/)?
(?P<file>(?:{{htmlentity}}|[^?#])+)
(?:\?(?P<querystring>(?:{{htmlentity}};|[^#])+))?
(?:#(?P<fragment>.*))?$

もちろん、JavaScriptでは名前付き後方参照を使用できないため、正規表現は次のようになります。

^(?:(\w+(?=:\/\/))(?::\/\/))?(?:((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^\/?#:]+)(?::([0-9]+))?)\/)?(?:((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)\/)?((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)(?:\?((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^#])+))?(?:#(.*))?$

そして、それぞれの一致で、プロトコルは\1、ホストは\2、ポートは\3、パス\4、ファイル\5、クエリ文字列\6、およびフラグメント\7です。


0
//USING REGEX
/**
 * Parse URL to get information
 *
 * @param   url     the URL string to parse
 * @return  parsed  the URL parsed or null
 */
var UrlParser = function (url) {
    "use strict";

    var regx = /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
        matches = regx.exec(url),
        parser = null;

    if (null !== matches) {
        parser = {
            href              : matches[0],
            withoutHash       : matches[1],
            url               : matches[2],
            origin            : matches[3],
            protocol          : matches[4],
            protocolseparator : matches[5],
            credhost          : matches[6],
            cred              : matches[7],
            user              : matches[8],
            pass              : matches[9],
            host              : matches[10],
            hostname          : matches[11],
            port              : matches[12],
            pathname          : matches[13],
            segment1          : matches[14],
            segment2          : matches[15],
            search            : matches[16],
            hash              : matches[17]
        };
    }

    return parser;
};

var parsedURL=UrlParser(url);
console.log(parsedURL);

0

私はURLパーティションを解析するためにこの正規表現を試しました:

^((http[s]?|ftp):\/)?\/?([^:\/\s]+)(:([^\/]*))?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*))(\?([^#]*))?(#(.*))?$

URL: https://www.google.com/my/path/sample/asd-dsa/this?key1=value1&key2=value2

一致:

Group 1.    0-7 https:/
Group 2.    0-5 https
Group 3.    8-22    www.google.com
Group 6.    22-50   /my/path/sample/asd-dsa/this
Group 7.    22-46   /my/path/sample/asd-dsa/
Group 8.    46-50   this
Group 9.    50-74   ?key1=value1&key2=value2
Group 10.   51-74   key1=value1&key2=value2

-1
String s = "https://www.thomas-bayer.com/axis2/services/BLZService?wsdl";

String regex = "(^http.?://)(.*?)([/\\?]{1,})(.*)";

System.out.println("1: " + s.replaceAll(regex, "$1"));
System.out.println("2: " + s.replaceAll(regex, "$2"));
System.out.println("3: " + s.replaceAll(regex, "$3"));
System.out.println("4: " + s.replaceAll(regex, "$4"));

次の出力を提供します:
1:https://
2:www.thomas-bayer.com
3:/
4:axis2 / services / BLZService?wsdl

URLを
Stringに変更した場合s = " https://www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; 出力は次のようになります
。1:https://
2:www.thomas-bayer.com
3 :?
4:wsdl = qwerwer&ttt = 888

楽しむ..
ヨシレフ


ポートを扱いません。言語にとらわれない。
Ohgodwhy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.