Lấy các phần của một URL (Regex)


132

Đưa ra URL (dòng đơn):
http://test.example.com/dir/subdir/file.html

Làm cách nào để trích xuất các phần sau bằng biểu thức chính quy:

  1. Tên miền con (kiểm tra)
  2. Tên miền (example.com)
  3. Đường dẫn không có tệp (/ dir / subir /)
  4. Tệp (file.html)
  5. Đường dẫn với tệp (/dir/subdir/file.html)
  6. URL không có đường dẫn ( http://test.example.com )
  7. (thêm bất kỳ cái nào khác mà bạn nghĩ sẽ hữu ích)

Regex sẽ hoạt động chính xác ngay cả khi tôi nhập URL sau:

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

Đây không phải là một câu trả lời trực tiếp nhưng hầu hết các thư viện web đều có chức năng hoàn thành nhiệm vụ này. Các chức năng thường được gọi là một cái gì đó tương tự CrackUrl. Nếu một chức năng như vậy tồn tại, sử dụng nó, nó gần như được đảm bảo là đáng tin cậy và hiệu quả hơn bất kỳ mã thủ công nào.
Konrad Rudolph

7
Vui lòng giải thích cho chúng tôi tại sao điều này cần phải được thực hiện với biểu thức chính quy. Nếu đó là bài tập về nhà, thì hãy nói điều đó bởi vì đó là hạn chế của bạn. Mặt khác, có các giải pháp dành riêng cho ngôn ngữ tốt hơn là sử dụng biểu thức chính quy.
Andy Lester

1
Các liên kết đến các mẫu đầu tiên và cuối cùng bị hỏng.
Người đàn ông Tin

Tại đây, bạn có thể tìm thấy cách trích xuất lược đồ, tên miền, TLD, cổng và đường dẫn truy vấn: stackoverflow.com/questions/9760588/
trộm

Câu trả lời:


151

Một regex duy nhất để phân tích cú pháp và chia nhỏ một URL đầy đủ bao gồm các tham số truy vấn và các neo, ví dụ

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\-]+)?$

Vị trí RexEx:

url: RegExp ['$ &'],

giao thức: RegExp. $ 2,

máy chủ: RegExp. $ 3,

đường dẫn: RegExp. $ 4,

tệp: RegExp. $ 6,

truy vấn: RegExp. $ 7,

băm: RegExp. $ 8

sau đó bạn có thể phân tích cú pháp máy chủ ('.' được phân cách) khá dễ dàng.

Những gì tôi sẽ làm là sử dụng một cái gì đó như thế này:

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

phân tích thêm 'phần còn lại' càng cụ thể càng tốt. Làm điều đó trong một regex là, tốt, một chút điên rồ.


4
Liên kết mãnippets.joyent.com/posts/show/523 không hoạt động kể từ ngày 20 tháng 10 năm 10
W3Max

19
Vấn đề là phần này: (.*)?Vì ngôi sao Kleene đã chấp nhận 0 trở lên, nên ?phần (0 hoặc 1) gây nhầm lẫn cho nó. Tôi đã sửa nó bằng cách thay đổi (.*)?thành (.+)?. Bạn cũng có thể xóa?
rossipedia

3
Xin chào Dve, tôi đã cải thiện thêm một chút để trích xuất example.com từ các url như ở http://www.example.com:8080/....đây:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
mnacos

4
và bằng chứng rằng không có biểu thức chính quy nào là hoàn hảo, đây là một điều chỉnh ngay lập tức:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
mnacos

2
Tôi đã sửa đổi biểu thức chính quy này để xác định tất cả các phần của URL (phiên bản cải tiến) - mã bằng Python ^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))? code Bạn hiển thị mã này trên hành động trên pythex.org
arannasousa

81

Tôi nhận ra rằng tôi đến bữa tiệc muộn, nhưng có một cách đơn giản để trình duyệt phân tích url cho bạn mà không cần regex:

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
Cho rằng câu hỏi ban đầu được gắn thẻ "bất khả tri ngôn ngữ", đây là ngôn ngữ gì?
MarkHu

lưu ý rằng giải pháp này yêu cầu sự tồn tại của tiền tố giao thức, ví dụ http://, để hiển thị chính xác các thuộc tính giao thức, máy chủ và tên máy chủ. Mặt khác, phần đầu của url cho đến dấu gạch chéo đầu tiên thuộc về giao thức.
Oleksii Aza

Tôi tin rằng điều này, mặc dù đơn giản, nhưng chậm hơn nhiều so với phân tích cú pháp RegEx.
demisx

Được hỗ trợ bởi tất cả các trình duyệt?
sean

1
Nếu chúng ta đang đi theo cách này, bạn cũng có thể làmvar url = new URL(someUrl)
gman

67

Tôi đến bữa tiệc muộn vài năm, nhưng tôi ngạc nhiên không ai nhắc đến đặc tả Định danh tài nguyên thống nhất có một phần về phân tích cú pháp URI bằng một biểu thức chính quy . Biểu thức chính quy, được viết bởi Berners-Lee và cộng sự, là:

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

Các số trong dòng thứ hai ở trên chỉ để hỗ trợ khả năng đọc; chúng chỉ ra các điểm tham chiếu cho mỗi biểu thức con (nghĩa là mỗi dấu ngoặc đơn được ghép nối). Chúng tôi đề cập đến giá trị phù hợp cho biểu hiện phụ là $. Ví dụ: khớp biểu thức trên với

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

kết quả trong các trận đấu phụ sau:

$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

Để biết giá trị của nó, tôi thấy rằng tôi phải thoát khỏi các dấu gạch chéo trong JavaScript:

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


4
câu trả lời chính xác! Chọn một cái gì đó từ RFC chắc chắn không bao giờ có thể làm điều sai trái
frankster

1
điều này không phân tích các tham số truy vấn
Rémy DAVID

2
Đây là một trong những tốt nhất afaict. Cụ thể điều này giải quyết hai vấn đề tôi đã gặp với những người khác 1:: Điều này giải quyết chính xác với các giao thức khác, chẳng hạn như ftp://mailto://. 2: Điều này thỏa thuận chính xác với usernamepassword. Các trường tùy chọn này được phân tách bằng dấu hai chấm, giống như tên máy chủ và cổng và nó sẽ vượt qua hầu hết các biểu thức khác mà tôi đã thấy. @ RémyDAVID Chuỗi truy vấn cũng không được phân tích cú pháp thông thường bởi locationđối tượng trình duyệt . Nếu bạn cần phân tích chuỗi truy vấn, hãy xem thư viện nhỏ của tôi để biết: uqs .
Stijn de Witt

2
Câu trả lời này xứng đáng được nhiều phiếu bầu hơn vì nó bao gồm khá nhiều giao thức.
Tianzhen Lin

1
Nó bị hỏng khi giao thức được ngụ ý HTTP với tên người dùng / mật khẩu (cú pháp bí mật và không hợp lệ về mặt kỹ thuật, tôi thừa nhận):, ví dụ user:pass@example.com- RFC 3986 nói: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

Tôi tìm thấy câu trả lời được bình chọn cao nhất (câu trả lời của hometoast) không hoạt động hoàn hảo với tôi. Hai vấn đề:

  1. Nó không thể xử lý số cổng.
  2. Phần băm bị hỏng.

Sau đây là phiên bản sửa đổi:

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

Vị trí của các bộ phận như sau:

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

Chỉnh sửa được đăng bởi người dùng anon:

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

1
Xin lưu ý rằng nó không hoạt động nếu URL không có đường dẫn sau tên miền - ví dụ: http://www.example.comhoặc nếu đường dẫn là một ký tự đơn lẻ http://www.example.com/a.
Fernando Correia

11

Tôi cần một Biểu thức thông thường để khớp với tất cả các url và tạo biểu thức này:

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

Nó phù hợp với tất cả các url, bất kỳ giao thức nào, thậm chí cả các url như

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

Kết quả (bằng JavaScript) trông như thế này:

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

Một url như

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

trông như thế này:

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

3
Nếu bạn muốn khớp toàn bộ địa chỉ tên miền / ip (không được phân tách bằng dấu chấm), hãy sử dụng địa chỉ này:/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
lepe

11

Tôi đã cố gắng giải quyết vấn đề này trong javascript, cần được xử lý bởi:

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');

vì (trong Chrome, ít nhất), nó phân tích thành:

{
  "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"
}

Tuy nhiên, đây không phải là trình duyệt chéo ( https://developer.mozilla.org/en-US/docs/Web/API/URL ), vì vậy tôi đã ghép chúng lại với nhau để kéo các phần giống nhau ra như trên:

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

Tín dụng cho regex này được gửi tới https://gist.github.com/rpflorence , người đã đăng jsperf này http://jsperf.com/url-parsing (ban đầu được tìm thấy ở đây: https://gist.github.com/jlong/2428561 # bình luận-310066 ) người đã đưa ra regex này ban đầu được dựa trên.

Các phần theo thứ tự này:

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
];

Ngoài ra còn có một thư viện nhỏ bao bọc nó và cung cấp các tham số truy vấn:

https://github.com/sadams/lite-url (cũng có sẵn trên bower)

Nếu bạn có một cải tiến, vui lòng tạo một yêu cầu kéo với nhiều thử nghiệm hơn và tôi sẽ chấp nhận và hợp nhất với lời cảm ơn.


Điều này thật tuyệt nhưng thực sự có thể làm với một phiên bản như thế này lấy ra các tên miền phụ thay vì máy chủ trùng lặp, tên máy chủ. Vì vậy, nếu tôi có http://test1.dev.mydomain.com/ví dụ nó sẽ rút ra test1.dev..
Lankymart

Điều này hoạt động rất tốt. Tôi đã tìm kiếm một cách để trích xuất các tham số auth bất thường từ các url, và điều này hoạt động rất đẹp.
Aaron M

6

Đề xuất một giải pháp dễ đọc hơn nhiều (bằng Python, nhưng áp dụng cho mọi regex):

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')

Bản in:

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

5

tên miền phụ và tên miền khó khăn vì tên miền phụ có thể có một số phần, như tên miền cấp cao nhất, 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 không thân thiện với regexes)


2
Rất hữu ích - Tôi đã thêm một bổ sung (http(s?)://[^/]+/)để lấy https
Mojowen

5

Phiên bản cải tiến này sẽ hoạt động đáng tin cậy như một trình phân tích cú pháp.

   // 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>#(.*))?$/

Từ câu trả lời của tôi cho một câu hỏi tương tự . Hoạt động tốt hơn một số khác được đề cập vì chúng có một số lỗi (chẳng hạn như không hỗ trợ tên người dùng / mật khẩu, không hỗ trợ tên tệp một ký tự, mã định danh đoạn bị hỏng).


2

Bạn có thể nhận được tất cả http / https, máy chủ, cổng, đường dẫn cũng như truy vấn bằng cách sử dụng đối tượng Uri trong .NET. nhiệm vụ khó khăn là chia máy chủ thành tên miền phụ, tên miền và TLD.

Không có tiêu chuẩn để làm như vậy và không thể đơn giản sử dụng phân tích chuỗi hoặc RegEx để tạo kết quả chính xác. Lúc đầu, tôi đang sử dụng chức năng RegEx nhưng không phải tất cả URL đều có thể phân tích chính xác tên miền phụ. Cách thực hành là sử dụng danh sách các TLD. Sau khi TLD cho một URL được xác định, phần bên trái là tên miền và phần còn lại là tên miền phụ.

Tuy nhiên, danh sách cần phải duy trì nó vì TLD mới là có thể. Thời điểm hiện tại tôi biết là publicsuffix.org duy trì danh sách mới nhất và bạn có thể sử dụng các công cụ phân tích tên miền từ mã google để phân tích danh sách hậu tố công khai và dễ dàng lấy tên miền phụ, tên miền và TLD bằng cách sử dụng đối tượng DomainName: domainName.SubDomain, domainName .Domain và domainName.TLD.

Câu trả lời này cũng hữu ích: Nhận tên miền phụ từ một URL

CaLLMeLaNN


2

Đây là một cái đã hoàn thành và không dựa vào bất kỳ giao thức nào.

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")

Bản in

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

Không ai ở trên làm việc cho tôi. Đây là những gì tôi đã kết thúc bằng cách sử dụng:

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

2

Tôi thích regex đã được xuất bản trong "Javascript: The Good Parts". Nó không quá ngắn và không quá phức tạp. Trang này trên github cũng có mã JavaScript sử dụng nó. Nhưng nó được điều chỉnh cho bất kỳ ngôn ngữ nào. https://gist.github.com/voodooGQ/4057330


1

Java cung cấp một lớp URL sẽ làm điều này. Đối tượng URL truy vấn.

Bên cạnh đó, PHP cung cấp parse_url () .


Dường như điều này không phân tích tên miền phụ?
Chris Dutrow

Asker yêu cầu regex. Lớp URL sẽ mở một kết nối khi bạn tạo nó.
MikeNereson

"Lớp URL sẽ mở một kết nối khi bạn tạo nó" - điều đó không chính xác, chỉ khi bạn gọi các phương thức như kết nối (). Nhưng sự thật là java.net.URL có phần nặng nề. Đối với trường hợp sử dụng này, java.net.URI là tốt hơn.
jcsahnwaldt phục hồi lại

1

Tôi khuyên bạn không nên sử dụng regex. Một lệnh gọi API như WinHttpCrackUrl () ít bị lỗi hơn.

http://msdn.microsoft.com/en-us/l Library / aa384092% 28VS85% 29.aspx


5
Và cũng rất cụ thể nền tảng.
Andir

2
Tôi nghĩ vấn đề là sử dụng một thư viện, thay vì phát minh lại bánh xe. Ruby, Python, Perl có các công cụ để xé các URL để lấy các URL đó thay vì triển khai một mẫu xấu.
Tin Man

1

Tôi đã thử một vài trong số này không đáp ứng nhu cầu của tôi, đặc biệt là những người được bình chọn cao nhất không bắt được url mà không có đường dẫn ( http://example.com/ )

cũng thiếu tên nhóm khiến nó không thể sử dụng được trong ansible (hoặc có lẽ kỹ năng jinja2 của tôi còn thiếu).

vì vậy đây là phiên bản của tôi được sửa đổi một chút với nguồn là phiên bản được bình chọn cao nhất tại đây:

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

0

Sử dụng http://www.fileformat.info/tool/regex.htm regex của hometoast hoạt động rất tốt.

Nhưng đây là thỏa thuận, tôi muốn sử dụng các mẫu regex khác nhau trong các tình huống khác nhau trong chương trình của mình.

Ví dụ: tôi có URL này và tôi có một bảng liệt kê tất cả các URL được hỗ trợ trong chương trình của tôi. Mỗi đối tượng trong bảng liệt kê có một phương thức getRegexPotype trả về mẫu regex mà sau đó sẽ được sử dụng để so sánh với một URL. Nếu mẫu regex cụ thể trả về true, thì tôi biết rằng URL này được chương trình của tôi hỗ trợ. Vì vậy, mỗi phép liệt kê có biểu thức chính của nó tùy thuộc vào vị trí cần tìm trong URL.

Gợi ý của Hometoast là tuyệt vời, nhưng trong trường hợp của tôi, tôi nghĩ rằng nó sẽ không hữu ích (trừ khi tôi sao chép dán cùng một biểu thức chính trong tất cả các bảng liệt kê).

Đó là lý do tại sao tôi muốn câu trả lời đưa ra regex cho từng tình huống riêng biệt. Mặc dù +1 cho quê hương. ;)


0

Tôi biết bạn đang tuyên bố không biết ngôn ngữ về vấn đề này, nhưng bạn có thể cho chúng tôi biết những gì bạn đang sử dụng chỉ để chúng tôi biết bạn có khả năng regex nào không?

Nếu bạn có khả năng cho các kết quả không bắt giữ, bạn có thể sửa đổi biểu thức của hometoast để các biểu hiện phụ mà bạn không quan tâm đến việc chụp được thiết lập như sau:

(?:SOMESTUFF)

Bạn vẫn phải sao chép và dán (và sửa đổi một chút) Regex vào nhiều vị trí, nhưng điều này có ý nghĩa - bạn không chỉ kiểm tra xem liệu có tồn tại phụ hay không, mà là nó tồn tại như một phần của URL . Sử dụng công cụ sửa đổi không bắt giữ cho biểu hiện phụ có thể cung cấp cho bạn những gì bạn cần và không có gì nữa, nếu tôi đọc chính xác, đó là những gì bạn muốn.

Cũng giống như một ghi chú nhỏ, nhỏ, biểu thức của hometoast không cần đặt dấu ngoặc quanh 's' cho 'https', vì anh ta chỉ có một ký tự trong đó. Bộ định lượng định lượng một ký tự (hoặc lớp ký tự hoặc biểu hiện phụ) trực tiếp trước chúng. Vì thế:

https?

sẽ phù hợp với 'http' hoặc 'https'.


0

regrec để có được đường dẫn URL mà không cần tệp.

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

Nó có thể hữu ích để thêm một đường dẫn tương đối vào url này.


0

Regex để thực hiện phân tích cú pháp đầy đủ là khá khủng khiếp. Tôi đã bao gồm các phản hồi có tên về mức độ dễ đọc và chia từng phần thành các dòng riêng biệt, nhưng nó vẫn trông như thế này:

^(?:(?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>.*))?$

Điều đòi hỏi nó phải thật dài dòng là ngoại trừ giao thức hoặc cổng, bất kỳ phần nào cũng có thể chứa các thực thể HTML, khiến cho việc phân định đoạn này khá khó khăn. Vì vậy, trong một vài trường hợp gần đây - máy chủ, đường dẫn, tệp, chuỗi truy vấn và đoạn, chúng tôi cho phép bất kỳ thực thể html hoặc bất kỳ ký tự nào không phải là ?hoặc #. Regex cho một thực thể html trông như thế này:

$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]+);"

Khi được trích xuất (tôi đã sử dụng cú pháp ria mép để thể hiện nó), nó trở nên dễ đọc hơn một chút:

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

Tất nhiên, trong JavaScript, bạn không thể sử dụng các phản hồi có tên, do đó regex trở thành

^(?:(\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]+);)|[^#])+))?(?:#(.*))?$

và trong mỗi trận đấu, giao thức là \1 , máy chủ lưu trữ \2, cổng là \3, đường dẫn \4, tệp \5, chuỗi truy vấn \6và đoạn \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

Tôi đã thử regex này để phân tích cú pháp phân vùng url:

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

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

Diêm:

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"));

Sẽ cung cấp đầu ra sau:
1: https: //
2: www.thomas-bayer.com
3: /
4: ax2 / services / BLZService? Wsdl

Nếu bạn thay đổi URL thành
Chuỗi s = " https: //www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; đầu ra sẽ như sau:
1: https: //
2: www.thomas-bayer.com
3 :?
4: wsdl = qwerwer & ttt = 888

tận hưởng ..
Yosi Lev


Không xử lý các cổng. Không phải ngôn ngữ bất khả tri.
Ohgodwhy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.