144

URL (1 行):
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
4

30 に答える 30

161

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

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

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

レックスエクスポジション:

url: 正規表現['$&'],

プロトコル:RegExp.$2,

ホスト:正規表現.$3,

パス:RegExp.$4,

ファイル:RegExp.$6,

クエリ:RegExp.$7,

hash:RegExp.$8

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

することは、次のようなものを使用することです:

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

さらに「残り」を解析して、可能な限り具体的にします。1 つの正規表現でそれを行うのは、ちょっとクレイジーです。

于 2008-08-26T11:06:09.173 に答える
87

私はパーティーに遅れていることに気づきましたが、正規表現なしでブラウザーに 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
*/
于 2012-09-18T04:10:33.213 に答える
35

最も投票数の多い回答 (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];
}
于 2008-11-21T16:28:57.970 に答える
12

すべての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] 
于 2012-08-15T19:56:29.290 に答える
6

サブドメインとドメインは難しいです。なぜなら、サブドメインには複数の部分があり、トップ レベル ドメイン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 は正規表現にはあまり適していません)

于 2008-08-26T11:17:28.727 に答える
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'
}
于 2013-07-26T23:51:52.367 に答える
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'
   }
于 2010-09-16T07:21:21.717 に答える
5

次のことを試してください。

^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?

HTTP / FTP、サブドメイン、フォルダー、ファイルなどをサポートしています。

簡単なグーグル検索から見つけました:

http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx

于 2008-08-26T11:10:16.497 に答える
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>#(.*))?$/

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

于 2009-01-14T04:13:34.910 に答える
2

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

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

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

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

カルメラン

于 2009-10-09T04:39:51.673 に答える
2

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

/^(?:((?:https?|s?ftp):)\/\/)([^:\/\s]+)(?::(\d*))?(?:\/([^\s?#]+)?([?][^?#]*)?(#.*)?)?/
于 2013-01-17T18:12:50.793 に答える
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
于 2012-12-27T16:17:33.907 に答える
1

I would recommend not using regex. An API call like WinHttpCrackUrl() is less error prone.

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

于 2009-11-30T19:35:38.403 に答える
1

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

ちなみに、PHP はparse_url()を提供しています。

于 2008-08-26T11:55:04.503 に答える
1

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

また、グループ名がないため、ansible で使用できません (または、おそらく私の jinja2 スキルが不足しています)。

したがって、これは私のバージョンをわずかに変更したもので、ソースはここで最も投票されたバージョンです:

^((?P<protocol>http[s]?|ftp):\/)?\/?(?P<host>[^:\/\s]+)(?P<path>((\/\w+)*\/)([\w\-\.]+[^#?\s]+))*(.*)?(#[\w\-]+)?$
于 2016-11-23T13:53:49.760 に答える
1

私はこれを構築します。非常に寛容なのは、それを分割するだけで URL をチェックしないことです。

^((http[s]?):\/\/)?([a-zA-Z0-9-.]*)?([\/]?[^?#\n]*)?([?]?[^?#\n]*)?([#]?[^?#\n]*)$

  • 一致 1 : :// を含む完全なプロトコル (http または https)
  • 一致 2 : :// のないプロトコル
  • マッチ 3 : ホスト
  • マッチ 4 : ナメクジ
  • マッチ 5 : パラメータ
  • マッチ 6 : アンカー

仕事

http://
https://
www.demo.com
/slug
?foo=bar
#anchor

https://demo.com
https://demo.com/
https://demo.com/slug
https://demo.com/slug/foo
https://demo.com/?foo=bar
https://demo.com/?foo=bar#anchor
https://demo.com/?foo=bar&bar=foo#anchor
https://www.greate-demo.com/

クラッシュ

#anchor#
?toto?
于 2020-10-21T17:35:11.367 に答える
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です。

于 2016-09-02T05:37:28.373 に答える
0

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

しかし、これが契約です。プログラムのさまざまな状況でさまざまな正規表現パターンを使用したいと考えています。

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

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

そのため、状況ごとに個別に正規表現を提供する答えが必要でした。ホームトーストには+1ですが。;)

于 2008-08-26T11:23:45.403 に答える
0

これについてあなたが言語にとらわれないと主張していることは知っていますが、あなたが持っている正規表現機能を知るために、何を使用しているか教えてもらえますか?

非キャプチャ一致の機能がある場合は、hometoast の式を変更して、キャプチャに関心のない部分式が次のように設定されるようにすることができます。

(?:SOMESTUFF)

正規表現を複数の場所にコピー アンド ペースト (およびわずかに変更) する必要がありますが、これは理にかなっています。部分式が存在するかどうかを確認するだけでなく、それがURL の一部として存在するかどうかを確認することです。部分式に非キャプチャ修飾子を使用すると、必要なものだけが得られます。正しく読んでいれば、それはあなたが望むものです。

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

https?

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

于 2008-08-26T11:34:49.463 に答える
0

regexp を使用して、ファイルなしで URL パスを取得します。

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

この URL に相対パスを追加する場合に便利です。

于 2009-07-16T22:22:56.330 に答える
-2
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





お楽しみください..
Yosi Lev

于 2015-12-24T10:55:39.233 に答える