একটি ইউআরএল (রেজেক্স) এর অংশ পাওয়া


132

ইউআরএল দেওয়া (একক লাইন):
http://test.example.com/dir/subdir/file.html

নিয়মিত এক্সপ্রেশন ব্যবহার করে আমি কীভাবে নিম্নলিখিত অংশগুলি বের করতে পারি:

  1. সাবডোমেন (পরীক্ষা)
  2. ডোমেন (উদাহরণ.কম)
  3. ফাইল (/ dir / subdir /) ছাড়া পাথ
  4. ফাইল (file.html)
  5. ফাইল (/dir/subdir/file.html) সহ পাথ
  6. পাথ ছাড়াই ইউআরএল ( http://test.example.com )
  7. (আপনার মনে হয় দরকারী হবে যে কোনও অন্য যোগ করুন)

আমি নিম্নলিখিত ইউআরএলটি প্রবেশ করিয়ে দিলেও রেজেক্সের সঠিকভাবে কাজ করা উচিত:

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

এটি সরাসরি উত্তর নয় তবে বেশিরভাগ ওয়েব লাইব্রেরিতে একটি কার্য রয়েছে যা এই কাজটি সম্পাদন করে। ফাংশন প্রায়শই অনুরূপ কিছু বলা হয় CrackUrl। যদি এই জাতীয় কোনও ক্রিয়াকলাপ বিদ্যমান থাকে তবে এটি ব্যবহার করুন, এটি কোনও হ্যান্ড-ক্র্যাফ্ট কোডের চেয়ে আরও নির্ভরযোগ্য এবং আরও দক্ষ হওয়ার গ্যারান্টিযুক্ত।
কনরাড রুডলফ

7
কেন এটি একটি রেজিেক্সের সাহায্যে করা দরকার তা আমাদের ব্যাখ্যা করুন। যদি এটি হোমওয়ার্ক হয়, তবে এটি বলুন কারণ এটি আপনার সীমাবদ্ধ। অন্যথায়, একটি রেজেক্স ব্যবহার করার চেয়ে ভাষা-নির্দিষ্ট সমাধানের চেয়ে ভাল better
অ্যান্ডি লেস্টার

1
প্রথম এবং শেষের নমুনার লিঙ্কগুলি নষ্ট হয়ে গেছে।
টিন ম্যান

এখানে আপনি কীভাবে স্কিম, ডোমেন, টিএলডি, পোর্ট এবং ক্যোয়ারী পথটি বের করবেন তা খুঁজে পেতে পারেন: stackoverflow.com/questions/9760588/…
পাওলো রোভেলি 21

উত্তর:


151

ক্যোয়ারী প্যারামিটার এবং অ্যাঙ্করগুলি সহ পুরো URL টি পার্স এবং ব্রেকআপ করার জন্য একটি একক রেজেক্স eg

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

রেক্সেক্স অবস্থান:

url: RegExp ['$ &'],

প্রোটোকল:। RegExp $ 2,

হোস্ট:। RegExp $ 3,

পথ:। RegExp $ 4,

ফাইল:। RegExp $ 6,

ক্যোয়ারী:। RegExp $ 7,

হ্যাশ। RegExp $ 8

তারপরে আপনি হোস্টটিকে আরও সহজে পার্স করতে পারেন ('।' সীমিত) খুব সহজেই।

কি আমি করতে চাই ভালো কিছু ব্যবহার:

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

আরও বিশ্লেষণ 'বিশ্রাম' যতটা সম্ভব সুনির্দিষ্ট হতে। এটি একটি রেজেক্সে করা ভাল, কিছুটা ক্রেজি।



19
সমস্যাটি হ'ল এই অংশটি: (.*)?যেহেতু ক্লিন তারকা ইতিমধ্যে 0 বা ততোধিক গ্রহণ করে, সেই ?অংশটি (0 বা 1) এটি বিভ্রান্ত করছে। আমি পরিবর্তন করে এটি সংশোধন (.*)?করতে (.+)?। আপনি কেবলমাত্র ?

3
হাই ডেভ, আমি এখানে ইউআরএলগুলি থেকে http://www.example.com:8080/....^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
url.com

4
এবং প্রমাণ করুন যে কোনও ^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
রেজিপেক্স

2
পাইথন-এর ইউআরএল (উন্নত সংস্করণ) - এর সমস্ত অংশ সনাক্ত করার জন্য আমি এই রেজেক্সটি সংশোধন করেছি ^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))? code আপনি পাইথেক্স.আর.এ
অরণসৌসৌ

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
দেওয়া হল যে মূল প্রশ্নটি "ভাষা-অজ্ঞাত", এটি কোন ভাষা?
মার্কহু

নোট করুন যে এই সমাধানটির জন্য প্রোটোকল উপসর্গের একটি অস্তিত্ব প্রয়োজন, উদাহরণস্বরূপ http://, প্রোটোকল, হোস্ট এবং হোস্টনামের বৈশিষ্ট্যগুলি সঠিকভাবে প্রদর্শন করার জন্য। অন্যথায় প্রথম স্ল্যাশ না হওয়া পর্যন্ত ইউআরএলের শুরু প্রোটোকল সম্পত্তিতে যায়।
ওলেক্সি আজা

আমি এটি সহজ, যদিও বিশ্বাস করি তবে RegEx পার্সিংয়ের চেয়ে অনেক ধীর।
demisx

এটি কি সমস্ত ব্রাউজার দ্বারা সমর্থিত?
শন

1
আমরা যদি এভাবে চলে var url = new URL(someUrl)
যাই তবে আপনিও

67

আমি পার্টিতে কয়েক বছর দেরিতে আছি, তবে আমি অবাক হয়েছি যে কেউ ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার স্পেসিফিকেশনটির উল্লেখ করেনি নিয়মিত প্রকাশের সাথে ইউআরআই পার্স করার বিষয়ে একটি বিভাগ রয়েছে । বার্নারস-লি দ্বারা লিখিত নিয়মিত প্রকাশ, ইত্যাদি।

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

উপরের দ্বিতীয় লাইনে সংখ্যাগুলি কেবল পঠনযোগ্যতার জন্য সহায়তা করে; তারা প্রতিটি সুপ্রেসপ্রেসনের জন্য রেফারেন্স পয়েন্টগুলি নির্দেশ করে (অর্থাত্ প্রতিটি জোড় করা প্রথম বন্ধনী)। আমরা subexpression এর সাথে মেলে মানটি $ হিসাবে উল্লেখ করি $ উদাহরণস্বরূপ, উপরের এক্সপ্রেশনটির সাথে মিল matching

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

নিম্নলিখিত subexpression মেলে ফলাফল:

$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

এটির মূল্যের জন্য, আমি দেখতে পেয়েছি যে জাভাস্ক্রিপ্টে আমাকে ফরোয়ার্ড স্ল্যাশগুলি থেকে বাঁচতে হয়েছিল:

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


4
দুর্দান্ত উত্তর! আরএফসি থেকে কোনও কিছু চয়ন করা অবশ্যই ভুল
কাজটিকে

1
এটি ক্যোয়ারী প্যারামিটারগুলি বিশ্লেষণ করে না
Rémy DAVID

2
এটি সেরা এক আফিক্যাল। : বিশেষভাবে এই দুটি সমস্যা আমি অন্যদের সঙ্গে দেখেছি adresses 1যেমন অন্যান্য প্রোটোকল সঙ্গে সঠিকভাবে এই পুলিশ: ftp://এবং mailto://2এই সঙ্গে সঠিকভাবে পুলিশ usernameএবং password। এই alচ্ছিক ক্ষেত্রগুলি হোস্টনাম এবং পোর্টের মতোই কোনও কোলন দ্বারা পৃথক করা হয়েছে এবং এটি আমি দেখেছি এমন বেশিরভাগ অন্যান্য রেজেক্সগুলিকে ট্রিপ করবে। @ র‌্যামিএডিভিআইডি ক্যোরিস্ট্রিংটি ব্রাউজার locationঅবজেক্ট দ্বারা সাধারণত পার্স করা হয় না । আপনার যদি ক্যোয়ারী স্ট্রিংটি পার্স করতে হয় তবে তার জন্য আমার ক্ষুদ্র লাইব্রেরিটি দেখুন: ইউকিউএস
স্টিজন ডি উইট

2
এই উত্তরটি আরও বেশি ভোটের প্রাপ্য কারণ এটি সমস্ত প্রোটোকলগুলিকে কভার করে।
তিয়ানজেন লিন

1
প্রোটোকলটি যখন কোনও ব্যবহারকারীর নাম / পাসওয়ার্ডের সাথে এইচটিটিপি প্রেরণ করা হয় তখন এটি ভেঙে যায় (উদাহরণ স্বরূপ এবং একটি প্রযুক্তিগতভাবে অবৈধ সিনট্যাক্স, আমি স্বীকার করি): যেমন user:pass@example.com- আরএফসি 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.
ম্যাট চেম্বারস

33

আমি সর্বাধিক ভোট দেওয়া উত্তর (হোমটোস্টের উত্তর) আমার পক্ষে নিখুঁতভাবে কাজ করে না। দুটি সমস্যা:

  1. এটি পোর্ট নম্বর পরিচালনা করতে পারে না।
  2. হ্যাশ অংশটি নষ্ট হয়ে গেছে।

নিম্নলিখিতটি একটি পরিবর্তিত সংস্করণ:

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

অংশগুলির অবস্থান নিম্নরূপ:

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

আনন ব্যবহারকারী পোস্ট করেছেন সম্পাদনা করুন:

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
ফার্নান্দো কোরিয়া

11

সমস্ত url- এর সাথে মেলে আমার একটি নিয়মিত এক্সপ্রেশন প্রয়োজন এবং এটি তৈরি করে:

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

এটি সমস্ত ইউআরএল, কোনও প্রোটোকল, এমনকি ইউআরএলগুলির সাথে মিলে

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

ফলাফল (জাভাস্ক্রিপ্টে) এর মতো দেখাচ্ছে:

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

একটি ইউআরএল পছন্দ

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

এটা এমন দেখতে:

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

3
: আপনি পুরো ডোমেইন / IP ঠিকানা (বিন্দু দ্বারা পৃথক করা) এই একটি ব্যবহার মেলে চান/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
Lepe

11

আমি এটি জাভাস্ক্রিপ্টে সমাধান করার চেষ্টা করছিলাম যা হ্যান্ডেল করা উচিত:

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

যেহেতু (ক্রোমে অন্তত) এটির বিশ্লেষণ করে:

{
  "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 # মন্তব্য -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 (বোরও উপলভ্য)

আপনার যদি উন্নতি হয় তবে দয়া করে আরও পরীক্ষার সাথে একটি টানুন অনুরোধ তৈরি করুন এবং আমি ধন্যবাদ সহ গ্রহণ করব এবং একীভূত হব।


এটি দুর্দান্ত তবে সত্যই এর মতো সংস্করণ দিয়ে করতে পারে যা সদৃশ হোস্ট, হোস্টনামের পরিবর্তে সাব-ডোমেনগুলি টেনে আনে। সুতরাং আমি http://test1.dev.mydomain.com/উদাহরণস্বরূপ যদি এটি টান হবে test1.dev.
লঙ্কায়মার্ট

এটি খুব ভাল কাজ করে। আমি ইউআরএলগুলি থেকে অস্বাভাবিক লেখক পরামিতিগুলি বের করার কোনও উপায় অনুসন্ধান করছি এবং এটি সুন্দরভাবে কাজ করে।
হারুন এম

6

আরও বেশি পঠনযোগ্য সমাধানের প্রস্তাব দিন (পাইথনে, তবে যে কোনও রেজেক্সের ক্ষেত্রে প্রযোজ্য):

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://[^/]+/)  

(মার্কডাউন রিজেক্সগুলির পক্ষে খুব বন্ধুত্বপূর্ণ নয়)


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

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


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- তে উরি অবজেক্ট ব্যবহার করে সমস্ত http / https, হোস্ট, পোর্ট, পাথের পাশাপাশি ক্যোয়ারী পেতে পারেন। হোস্টটিকে সাব ডোমেন, ডোমেন নেম এবং টিএলডি বিভক্ত করা কেবল কঠিন কাজ।

এটি করার কোনও মানদণ্ড নেই এবং সঠিক ফলাফলটি উত্পন্ন করতে স্ট্রিং পার্সিং বা রেজিএক্স ব্যবহার করা যাবেনা। প্রথমে, আমি RegEx ফাংশনটি ব্যবহার করছি তবে সমস্ত URL টি সাবডোমেনটিকে সঠিকভাবে পার্স করা যায় না। অনুশীলনের উপায়টি হল টিএলডিগুলির একটি তালিকা ব্যবহার করা। কোনও ইউআরএল জন্য একটি টিএলডি সংজ্ঞায়িত করার পরে বাম অংশটি হল ডোমেন এবং বাকীটি সাব ডোমেন।

তবে তালিকাটি এটি বজায় রাখা দরকার যেহেতু নতুন টিএলডি সম্ভব। বর্তমান মুহুর্তে আমি জানি পাবলিকসুফিক্স.আরগ সর্বশেষতম তালিকাটি বজায় রেখেছে এবং আপনি পাবলিক প্রত্যয় তালিকাকে পার্স করার জন্য গুগল কোড থেকে ডোমেননাম-পার্সার সরঞ্জামগুলি ব্যবহার করতে পারেন এবং ডোমেননাম অবজেক্ট: ডোমেননেম.সুবডমাইন, ডোমেইননাম ব্যবহার করে সহজেই সাব ডোমেন, ডোমেন এবং টিএলডি পেতে পারেন you .ডোমেন এবং ডোমেইননাম.টিএলডি।

এই উত্তরগুলিও সহায়ক: একটি URL থেকে সাবডোমেন পান main

CaLLMeLaNN


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

আমি "জাভাস্ক্রিপ্ট: দ্য গুড পার্টস" এ প্রকাশিত রেইগেক্সটি পছন্দ করি। এটি খুব ছোট এবং খুব জটিল নয়। গিথুবের এই পৃষ্ঠায় জাভা স্ক্রিপ্ট কোড রয়েছে যা এটি ব্যবহার করে। তবে এটি যে কোনও ভাষার জন্য মানিয়ে নেওয়া। https://gist.github.com/voodooGQ/4057330


1

জাভা একটি ইউআরএল ক্লাস দেয় যা এটি করবে offers ইউআরএল অবজেক্টগুলি অনুসন্ধান করুন।

পার্শ্ব নোটে, পিএইচপি পার্সে_আর্ল () সরবরাহ করে


দেখে মনে হচ্ছে এটি সাবডোমেনটি বিশ্লেষণ করে না?
ক্রিস ডাট্রো

প্রশ্নকর্তা রেজেক্সের জন্য জিজ্ঞাসা করলেন। আপনি যখন এটি তৈরি করবেন তখন ইউআরএল শ্রেণি একটি সংযোগ খুলবে।
মাইকনোরসন

"আপনি যখন এটি তৈরি করবেন তখন ইউআরএল শ্রেণি একটি সংযোগ খুলবে" - এটি ভুল, কেবল যখন আপনি কানেক্ট () এর মতো পদ্ধতিগুলি কল করেন। তবে এটি সত্য যে java.net. URL কিছুটা ভারী। এই ব্যবহারের ক্ষেত্রে, java.net.URI আরও ভাল।
jcsahnwaldt মনিকা

1

আমি regex ব্যবহার না করার পরামর্শ দেব। WinHttpCrackUrl () এর মতো একটি এপিআই কল কম ত্রুটির প্রবণ।

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


5
এবং খুব প্ল্যাটফর্ম নির্দিষ্ট।
আন্দির

2
আমি মনে করি বিন্দুটি হুইলটি রিভেন্ট করার চেয়ে লাইব্রেরি ব্যবহার করা ছিল। রুবি, পাইথন, পার্লের ইউআরএল ছিন্ন করার সরঞ্জাম রয়েছে তাই কোনও খারাপ প্যাটার্ন প্রয়োগের পরিবর্তে সেগুলি ধরুন।
টিন ম্যান

1

আমি এগুলির মধ্যে কয়েকটি চেষ্টা করেছি যা আমার প্রয়োজনগুলি কভার করে না, বিশেষত সর্বোচ্চ ভোট দেওয়া যা কোনও পাথ ছাড়াই ইউআরএল ধরেনি ( http://example.com/ )

এছাড়াও গ্রুপ নামের অভাব এটিকে জবাবদিহি করতে অযোগ্য করে তোলে (বা সম্ভবত আমার জিনজা 2 দক্ষতার অভাব রয়েছে)।

সুতরাং উত্সটি এখানে সর্বোচ্চ ভোট প্রাপ্ত সংস্করণ হিসাবে এটি আমার সংস্করণটি সামান্য পরিবর্তিত হয়েছে:

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

0

Http://www.fileformat.info/tool/regex.htm হোমিওস্টাস্টের রেজেক্স ব্যবহার দুর্দান্ত কাজ করে।

তবে এখানে চুক্তিটি হ'ল, আমি আমার প্রোগ্রামে বিভিন্ন পরিস্থিতিতে বিভিন্ন রেজেক্স প্যাটার্ন ব্যবহার করতে চাই।

উদাহরণস্বরূপ, আমার এই ইউআরএল রয়েছে এবং আমার কাছে একটি গণনা রয়েছে যা আমার প্রোগ্রামে সমস্ত সমর্থিত ইউআরএল তালিকাভুক্ত করে। অঙ্কের প্রতিটি বস্তুর একটি পদ্ধতি getRegexPattern রয়েছে যা রেজেক্স প্যাটার্নটি দেয় যা তারপরে একটি URL এর সাথে তুলনা করতে ব্যবহৃত হবে। যদি নির্দিষ্ট রেজেক্স প্যাটার্নটি সত্য হয় তবে আমি জানি যে এই URL টি আমার প্রোগ্রাম দ্বারা সমর্থিত। সুতরাং, ইউআরএল-এর ভিতরে এটি কোথায় দেখা উচিত তার উপর নির্ভর করে প্রতিটি গণকের নিজস্ব রেজেক্স থাকে।

হোমটোস্টের পরামর্শটি দুর্দান্ত, তবে আমার ক্ষেত্রে, আমি মনে করি এটি কোনও লাভ করবে না (যদি না আমি সমস্ত গণনায় একই রেজেক্সটি কপি করি)।

সে কারণেই আমি উত্তর চেয়েছিলাম প্রতিটি পরিস্থিতির জন্য আলাদাভাবে রেজিেক্স দিতে give যদিও হোমটোস্টের জন্য +1। ;)


0

আমি জানি আপনি এটিতে ভাষা-অজ্ঞাত দাবি করছেন, তবে আপনি কী আমাদের ব্যবহার করতে পারেন তা কী আপনি আমাদের বলতে পারেন যাতে আপনার কী রেজেক্স ক্ষমতা রয়েছে?

যদি আপনার ক্যাপচার না করার ম্যাচগুলির ক্ষমতা থাকে তবে আপনি হোমটিস্টের অভিব্যক্তিটি সংশোধন করতে পারেন যাতে আপনি ক্যাপচারে আগ্রহী নন এমন সুপারিশগুলি এইভাবে সেট আপ করা হয়:

(?:SOMESTUFF)

আপনাকে এখনও একাধিক স্থানে রেজেক্স অনুলিপি করতে (এবং কিছুটা সংশোধন করতে) করতে হবে, তবে এটি অর্থবোধ করে - আপনি কেবল স্যুপ এক্সপ্রেশনটি উপস্থিত কিনা তা পরীক্ষা করে দেখছেন না, বরং এটি কোনও ইউআরএল এর অংশ হিসাবে উপস্থিত রয়েছে কিনা তা দেখার জন্য । সবে এক্সপ্রেসনের জন্য নন-ক্যাপচারিং মডিফায়ার ব্যবহার করা আপনাকে যা প্রয়োজন তা আপনাকে দিতে পারে এবং আরও কিছু না, যা আমি যদি আপনাকে সঠিকভাবে পড়ছি তবে আপনি যা চান তা তাই।

একটি ছোট, ছোট নোটের মতো, হোমটিস্টের প্রকাশের জন্য 'https' এর জন্য 'গুলি' এর চারপাশে বন্ধনী লাগানোর দরকার নেই, কারণ সেখানে তার কেবল একটি চরিত্র রয়েছে। কোয়ান্টিফায়ারগুলি সরাসরি তাদের পূর্ববর্তী একটি অক্ষর (বা চরিত্র শ্রেণি বা সুব এক্সপ্রেসন) পরিমাণকে মাপ দেয়। তাই:

https?

'ঠিক' বা 'https' এর সাথে মিলবে ঠিক ঠিক।


0

ফাইল ছাড়াই ইউআরএল পাথ পেতে রিজেপেক্স।

url = ' http: // ডোমেইন / dir1 / dir2 / সামিফাইল ' url.scan (/ ^ (http: // [^ /] +)) ((?: / [^ /] +) + (? = /)) ? /? (: [^ /])? $ / ঝ) .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>.*))?$

যে জিনিসটির এটির ভার্বোস হওয়ার প্রয়োজন তা হ'ল প্রোটোকল বা বন্দর ব্যতীত যে কোনও অংশে এইচটিএমএল সত্তা থাকতে পারে যা এই খণ্ডটির চিত্রকে জটিল করে তোলে। তাই গত কয়েক ক্ষেত্রে - হোস্ট, পাথ, ফাইল, querystring, এবং টুকরা, আমরা হয় কোন 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>.*))?$

অবশ্যই জাভাস্ক্রিপ্টে, আপনি নামযুক্ত ব্যাকরিফারেন্সগুলি ব্যবহার করতে পারবেন না, তাই রেজেেক্স হয়ে যায়

^(?:(\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

ইউআরএল পার্টিশন পার্স করার জন্য আমি এই রেজেক্সটি চেষ্টা করেছি:

^((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 / পরিষেবাগুলি / BLZService wsdl

আপনাকে URL পরিবর্তন যদি
"স্ট্রিং গুলি = HTTPS: //www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; আউটপুট নিম্নলিখিত হবে:
1: https: //
2: www.thomas-bayer.com
3 :?
4: ডাব্লুএসডিএল = কিউয়ারওয়ার & টিটিটি = 888

উপভোগ করুন ..
ইয়োসি লেভ


পোর্টগুলি পরিচালনা করে না। ভাষা অজ্ঞানী নয়।
ওহগোডে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.