سؤال

أنا بحاجة لاختبار العامة عناوين المواقع باستخدام أي بروتوكول (http, https, shttp, ftp, إس, mysql و أشياء لا يعرفون).

أول هو هذا:

\w+://(\w+\.)+[\w+](/[\w]+)(\?[-A-Z0-9+&@#/%=~_|!:,.;]*)?

(PCRE و .صافي حتى لا يتوهم)

هل كانت مفيدة؟

المحلول

ووفقا ل RFC2396 :

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

نصائح أخرى

مضيفا أن RegEx كما ويكي الجواب:

[\w+-]+://([a-zA-Z0-9]+\.)+[[a-zA-Z0-9]+](/[%\w]+)(\?[-A-Z0-9+&@#/%=~_|!:,.;]*)?

الخيار 2 (إعادة CMS)

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

ولكن هذا التراخي على أي عاقل حتى قلص لجعله أكثر تقييدا و التفريق من أشياء أخرى.

proto      ://  name      : pass      @  server    :port      /path     ? args
^([^:/?#]+)://(([^/?#@:]+(:[^/?#@:]+)?@)?[^/?#@:]+(:[0-9]+)?)(/[^?#]*)(\?([^#]*))?

وجئت إلى هذا من اتجاه مختلف قليلا. أردت أن تحاكي قدرة gchats لمباراة something.co.uk وlinkify ذلك. فذهبت مع التعابير المنطقية التي تبدو ل. دون أي فترة التالية أو مسافة على جانبي ومن ثم الاستيلاء على كل شيء من حوله حتى يضرب بيضاء. أنها لا تتطابق مع الفترة في نهاية URI لكن أنا أخذ هذا الخروج في وقت لاحق. ولذلك فإن هذا يمكن أن يكون خيارا إذا كنت تفضل ايجابيات كاذبة على المفقودين بعض الإمكانيات

url_re = re.compile(r"""
           [^\s]             # not whitespace
           [a-zA-Z0-9:/\-]+  # the protocol and domain name
           \.(?!\.)          # A literal '.' not followed by another
           [\w\-\./\?=&%~#]+ # country and path components
           [^\s]             # not whitespace""", re.VERBOSE) 

url_re.findall('http://thereisnothing.com/a/path adn some text www.google.com/?=query#%20 https://somewhere.com other-countries.co.nz. ellipsis... is also a great place to buy. But try text-hello.com ftp://something.com')

['http://thereisnothing.com/a/path',
 'www.google.com/?=query#%20',
 'https://somewhere.com',
 'other-countries.co.nz.',
 'text-hello.com',
 'ftp://something.com']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top