কোনও স্ট্রিং বৈধ ইউআরএল কিনা তা যাচাই করার জন্য সেরা নিয়মিত প্রকাশটি কী?


795

প্রদত্ত স্ট্রিংটি একটি বৈধ URL ঠিকানা কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

নিয়মিত এক্সপ্রেশন সম্পর্কে আমার জ্ঞানটি মৌলিক এবং ওয়েবে ইতিমধ্যে শত শত নিয়মিত অভিব্যক্তিগুলির মধ্যে আমাকে চয়ন করতে দেয় না।


31
কোন ইউআরএল বা কেবল এইচটিটিপি? যেমন মেইলটো: me@example.com একটি ইউআরএল হিসাবে গণনা করে? একটি এআইএম চ্যাট লিঙ্ক?
মক্কি

1
যদি কোনও URL এর কোনও শীর্ষস্থানীয় "HTTP (ইত্যাদি)" না থাকে তবে আপনি কীভাবে এটির বিন্দুতে সংঘটিত হওয়ার মতো অন্য কোনও নির্বিচার স্ট্রিং থেকে আলাদা করতে সক্ষম হবেন? "MyClass.MyProperty.MyMethod" এর মতো কিছু বলুন? অথবা "আমি স্পেসবারকে মিস করি is এটি কোনও সমস্যা?"
তোমালাক

1
আমি ইতিমধ্যে 'http: / / www' উপসর্গ করেছি। পাঠ্যবক্সের আগে সুতরাং ব্যবহারকারীর 'http: / / www' প্রবেশ করার দরকার নেই। এবং কেবল প্রয়োজনীয় ইউরি নাম প্রবেশের সাথে উদ্বিগ্ন হওয়া উচিত।
ইনপুট

1
আপনি কোন প্রোগ্রামিং ভাষা ব্যবহার করছেন? আপনি সম্ভবত চাকাটি পুনর্নবীকরণ করতে চান না।
একটি অর্থ প্রদান

9
মাইক্রোসফ্টের একটি রেজেক্স পৃষ্ঠা রয়েছে যা ইউআরএলগুলির জন্য একটি অভিব্যক্তি অন্তর্ভুক্ত করে। নিশ্চয়ই একটি ভাল শুরু: এমএসডিএন.মাইক্রোসফট /en-us/library/ff650303.aspx এনবি। উপরের পৃষ্ঠাটি অবসরপ্রাপ্ত, তবে সারণীতে প্রকাশিত রেফারেন্সগুলি মূলত এখনও রেফারেন্সের জন্য বৈধ। ইউআরএল এক্সপ্রেশনটি সুপারিশ করা হয়েছে (এবং এটি আমার জন্য দুর্দান্ত কাজ করেছে): "^ (এইচটি | চ) টিপি (গুলি) \: \ / \ / [0-9a-zA-Z] ([-। \ W] * [ 0-9a zA-জেড]) * (:( 0-9) *) * (\ /) ([zA-Z0-9 \ -। \ \ \, \ '\ / \\\ + + & amp;% \ $ # _] *)? $ "
সিএমএইচ

উত্তর:


407

আরএফসি 3987 ( http://www.faqs.org/rfcs/rfc3987.html ) মেনে চলার জন্য আমি আমার ইউআরএল (আসলে আইআরআই, আন্তর্জাতিকীকরণ) প্যাটার্নটি লিখেছি । এগুলি পিসিআরআই সিনট্যাক্সে রয়েছে।

পরম আইআরআই (আন্তর্জাতিকীকরণের) জন্য:

/^[a-z](?:[-a-z0-9\+\.])*:(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+\.[-a-z0-9\._~!\$&'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*)?|(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\/\?])*)?$/i

আপেক্ষিক আইআরআইগুলিকেও অনুমতি দেওয়ার জন্য:

/^(?:[a-z](?:[-a-z0-9\+\.])*:(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+\.[-a-z0-9\._~!\$&'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*)?|(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\/\?])*)?|(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+\.[-a-z0-9\._~!\$&'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*)?|(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=@])+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\/\?])*)?)$/i

সেগুলি কীভাবে সংকলিত হয়েছিল (পিএইচপি তে):

<?php

/* Regex convenience functions (character class, non-capturing group) */
function cc($str, $suffix = '', $negate = false) {
    return '[' . ($negate ? '^' : '') . $str . ']' . $suffix;
}
function ncg($str, $suffix = '') {
    return '(?:' . $str . ')' . $suffix;
}

/* Preserved from RFC3986 */

$ALPHA = 'a-z';
$DIGIT = '0-9';
$HEXDIG = $DIGIT . 'a-f';

$sub_delims = '!\\$&\'\\(\\)\\*\\+,;=';
$gen_delims = ':\\/\\?\\#\\[\\]@';
$reserved = $gen_delims . $sub_delims;
$unreserved = '-' . $ALPHA . $DIGIT . '\\._~';

$pct_encoded = '%' . cc($HEXDIG) . cc($HEXDIG);

$dec_octet = ncg(implode('|', array(
    cc($DIGIT),
    cc('1-9') . cc($DIGIT),
    '1' . cc($DIGIT) . cc($DIGIT),
    '2' . cc('0-4') . cc($DIGIT),
    '25' . cc('0-5')
)));

$IPv4address = $dec_octet . ncg('\\.' . $dec_octet, '{3}');

$h16 = cc($HEXDIG, '{1,4}');
$ls32 = ncg($h16 . ':' . $h16 . '|' . $IPv4address);

$IPv6address = ncg(implode('|', array(
    ncg($h16 . ':', '{6}') . $ls32,
    '::' . ncg($h16 . ':', '{5}') . $ls32,
    ncg($h16, '?') . '::' . ncg($h16 . ':', '{4}') . $ls32,
    ncg($h16 . ':' . $h16, '?') . '::' . ncg($h16 . ':', '{3}') . $ls32,
    ncg(ncg($h16 . ':', '{0,2}') . $h16, '?') . '::' . ncg($h16 . ':', '{2}') . $ls32,
    ncg(ncg($h16 . ':', '{0,3}') . $h16, '?') . '::' . $h16 . ':' . $ls32,
    ncg(ncg($h16 . ':', '{0,4}') . $h16, '?') . '::' . $ls32,
    ncg(ncg($h16 . ':', '{0,5}') . $h16, '?') . '::' . $h16,
    ncg(ncg($h16 . ':', '{0,6}') . $h16, '?') . '::',
)));

$IPvFuture = 'v' . cc($HEXDIG, '+') . cc($unreserved . $sub_delims . ':', '+');

$IP_literal = '\\[' . ncg(implode('|', array($IPv6address, $IPvFuture))) . '\\]';

$port = cc($DIGIT, '*');

$scheme = cc($ALPHA) . ncg(cc('-' . $ALPHA . $DIGIT . '\\+\\.'), '*');

/* New or changed in RFC3987 */

$iprivate = '\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}';

$ucschar = '\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}' .
    '\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}' .
    '\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}' .
    '\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}' .
    '\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}' .
    '\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}';

$iunreserved = '-' . $ALPHA . $DIGIT . '\\._~' . $ucschar;

$ipchar = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . ':@'));

$ifragment = ncg($ipchar . '|' . cc('\\/\\?'), '*');

$iquery = ncg($ipchar . '|' . cc($iprivate . '\\/\\?'), '*');

$isegment_nz_nc = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . '@'), '+');
$isegment_nz = ncg($ipchar, '+');
$isegment = ncg($ipchar, '*');

$ipath_empty = '(?!' . $ipchar . ')';
$ipath_rootless = ncg($isegment_nz) . ncg('\\/' . $isegment, '*');
$ipath_noscheme = ncg($isegment_nz_nc) . ncg('\\/' . $isegment, '*');
$ipath_absolute = '\\/' . ncg($ipath_rootless, '?'); // Spec says isegment-nz *( "/" isegment )
$ipath_abempty = ncg('\\/' . $isegment, '*');

$ipath = ncg(implode('|', array(
    $ipath_abempty,
    $ipath_absolute,
    $ipath_noscheme,
    $ipath_rootless,
    $ipath_empty
))) . ')';

$ireg_name = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . '@'), '*');

$ihost = ncg(implode('|', array($IP_literal, $IPv4address, $ireg_name)));
$iuserinfo = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . ':'), '*');
$iauthority = ncg($iuserinfo . '@', '?') . $ihost . ncg(':' . $port, '?');

$irelative_part = ncg(implode('|', array(
    '\\/\\/' . $iauthority . $ipath_abempty . '',
    '' . $ipath_absolute . '',
    '' . $ipath_noscheme . '',
    '' . $ipath_empty . ''
)));

$irelative_ref = $irelative_part . ncg('\\?' . $iquery, '?') . ncg('\\#' . $ifragment, '?');

$ihier_part = ncg(implode('|', array(
    '\\/\\/' . $iauthority . $ipath_abempty . '',
    '' . $ipath_absolute . '',
    '' . $ipath_rootless . '',
    '' . $ipath_empty . ''
)));

$absolute_IRI = $scheme . ':' . $ihier_part . ncg('\\?' . $iquery, '?');

$IRI = $scheme . ':' . $ihier_part . ncg('\\?' . $iquery, '?') . ncg('\\#' . $ifragment, '?');

$IRI_reference = ncg($IRI . '|' . $irelative_ref);

March মার্চ ২০১১ সম্পাদনা করুন: পিএইচপি যেভাবে উদ্ধৃত স্ট্রিংগুলিতে ব্যাকস্ল্যাশগুলি পরিচালনা করে, সেগুলি ডিফল্টরূপে অব্যর্থ। আপনার ব্যাকস্ল্যাশগুলিতে ডাবল-পলায়ন করতে হবে যেখানে ব্যাকস্ল্যাশের রেজেক্সের একটি বিশেষ অর্থ রয়েছে except আপনি এইভাবে এটি করতে পারেন:

$escape_backslash = '/(?<!\\)\\(?![\[\]\\\^\$\.\|\*\+\(\)QEnrtaefvdwsDWSbAZzB1-9GX]|x\{[0-9a-f]{1,4}\}|\c[A-Z]|)/';
$absolute_IRI = preg_replace($escape_backslash, '\\\\', $absolute_IRI);
$IRI = preg_replace($escape_backslash, '\\\\', $IRI);
$IRI_reference = preg_replace($escape_backslash, '\\\\', $IRI_reference);

74
আপনি যদি এটি খারাপ বলে মনে করেন, আপনার ইমেলটির
পিটার ডি সেকো

12
@ গম্বো, এটি অনুমানের মধ্যে অনুমোদিত এবং HTTP অ্যাপ্লিকেশনগুলির জন্য ইউআরআই বাস্তবায়নে ব্যবহৃত হয়। এটি নিরুৎসাহিত (স্পষ্ট কারণে) তবে পুরোপুরি বৈধ এবং প্রত্যাশিত হওয়া উচিত। বেশিরভাগ (যদি সব না?) ব্রাউজারগুলি কখনও কখনও পরবর্তী অ্যাক্সেসের জন্য এইচটিটিপি প্রমাণীকরণের URL টি অনুবাদ করে।
পলকহীনতা

12
@ ডেভিন, কোন ভাষায় কোন অনুষ্ঠানে? আমি এটি পিএইচপিতে সংকলন করেছি, তবে এটি অন্যান্য ভাষায় ব্যবহার করা যেতে পারে। আমি কি এই সমস্ত ভাষায় একটি ফাংশন লিখতে হবে? পর্যায়ক্রমে, আপনার পছন্দের ভাষায় আপনার একই কাজ করা খুব সহজ হবে।
চোখের পলকহীনতা

6
@ জোশকমলে যদি আপনি জেএস
লিখেন

4
হ্যাঁ, http://comএকটি বৈধ URL। http://localhostঅন্য শব্দ কেন হবে না? আপনি ঠিক করেছেন যে uপিএইচপি-তে সংশোধকটি প্রয়োজনীয়। আমি পরিষ্কার হতে চাই যে আমি এইগুলি পিএইচপি দিয়ে তৈরি করার সময় এগুলি পিএইচপি-নির্দিষ্ট হতে বোঝানো হয়নি।
চোখের পলকহীনতা

152

আমি সর্বাধিক ব্যবহৃত ফর্ম্যাটগুলিতে ইউআরএল সনাক্তকরণের দুর্দান্ত সমাধানের জন্য একটি ব্লগ পোস্ট লিখেছি যেমন:

  • www.google.com
  • http://www.google.com
  • mailto:somebody@google.com
  • somebody@google.com
  • www.url-with-querystring.com/?url=has-querystring

নিয়মিত প্রকাশ ব্যবহৃত হয়:

/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/

17
এটিও কাজ করে, তবে এটি পোর্ট নম্বরটির জন্য সমর্থন হারিয়েছে (ডিবাগিংয়ে দরকারী)। পরিবর্তিত হবে/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
Jaime Cham

2
এই রেজেক্স তাদের মধ্যে প্রথম বন্ধনীগুলির সাথে লিঙ্কগুলি পরিচালনা করে না: উদাহরণস্বরূপ msdn.microsoft.com/en-us/library/ms563775(v=office.14).aspx
রবিএইচ

4
Www এর পরে বিন্দুটি কী পালানো উচিত নয়?
অ্যান্টনি

13
আর একটি ম্যাচ সাথি পেয়েছেন: width:210px;এবংmargin:3px
কাস ব্লিম

1
"উদাহরণ.কম" এর সাথে মেলে না ...?
গুস্তাভ

80

কি প্ল্যাটফর্ম? .NET ব্যবহার করে, ব্যবহার করুন System.Uri.TryCreate, একটি রেজেস না।

উদাহরণ স্বরূপ:

static bool IsValidUrl(string urlString)
{
    Uri uri;
    return Uri.TryCreate(urlString, UriKind.Absolute, out uri)
        && (uri.Scheme == Uri.UriSchemeHttp
         || uri.Scheme == Uri.UriSchemeHttps
         || uri.Scheme == Uri.UriSchemeFtp
         || uri.Scheme == Uri.UriSchemeMailto
            /*...*/);
}

// In test fixture...

[Test]
void IsValidUrl_Test()
{
    Assert.True(IsValidUrl("http://www.example.com"));
    Assert.False(IsValidUrl("javascript:alert('xss')"));
    Assert.False(IsValidUrl(""));
    Assert.False(IsValidUrl(null));
}

( টিপসটির জন্য @ যোশিকে ধন্যবাদ জানাইjavascript: )


6
ইউরি ট্রাইক্রিয়েট () এটি কার্যকর হলে সত্যটি ফিরিয়ে দেয়
ডানকান স্মার্ট

112
এই কৌশলটি যে কেউ ব্যবহার করে তার জন্য একটি বিশাল সতর্কতা: System.Uri সঠিকভাবে গ্রহণ করে javascript: alert('blah')। আপনাকে HTTP / https / ftp প্রোটোকল ব্যবহার হচ্ছে কিনা তা নিশ্চিত করতে আপনাকে Uri.Scheme এ আরও বৈধতা দেওয়ার দরকার হয়, অন্যথায় যদি আপনার এএসপি.নেট পৃষ্ঠাগুলির লিঙ্ক হিসাবে একটি URL URL োকানো হয় তবে আপনার ব্যবহারকারীরা এক্সএসএস আক্রমণে ঝুঁকিপূর্ণ
যোশি

23
উল্লেখযোগ্যভাবে, Uri.TryCreate খালি স্ট্রিংয়ের জন্যও সত্য দেয়। দেখা যাচ্ছে ট্রাইক্রিয়েট খুব কার্যকর নয় ...
স্টিভেন ইভার্স

1
আমার যদি কোনও এএসপি.নেট এমভিসি অ্যাপে সার্ভার / ক্লায়েন্ট-সাইড করার জন্য একটি রেইজেক্স দরকার হয় তবে কী হবে? এটি কীভাবে আমাকে ক্লায়েন্টে সহায়তা করবে?
আন্দ্রে রেনিয়া

4
নেট জন্য, ব্যবহারUri.IsWellFormedUriString()
মহিমান

57

RegexBuddy যা ব্যবহার করে তা এখানে ।

(\b(https?|ftp|file)://)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

এটি নীচের সাথে মিলছে ( ** **চিহ্নগুলির মধ্যে):

**http://www.regexbuddy.com**  
**http://www.regexbuddy.com/**  
**http://www.regexbuddy.com/index.html**  
**http://www.regexbuddy.com/index.html?source=library**  

আপনি http://www.regexbuddy.com/download.html এ রেগেক্সবাডি ডাউনলোড করতে পারেন ।


29
গোফের কী হবে? দরিদ্র, ভুলে যাওয়া গোফার।
টুহুল

3
আপনার রেজেক্স কোনও url- এর সাথে মেলে না - এতে আপনি অন্তর্ভুক্ত থাকাগুলিকেও অন্তর্ভুক্ত করতে পারেন। আমি আপনার রেজেক্সটিকে রুবুলার ডট কম এ পেস্ট করেছি এবং এটিতে "ফরোয়ার্ড স্ল্যাশগুলি এড়াতে হবে।" কোনও টাইপো আছে বা আপনি এটি রবুলার.কম এ কাজ করে স্পষ্ট করে বলতে পারেন?
পান্ডাওয়ুড

3
@ পান্ডাওড এর কারণ আপনাকে রুবির ফর্ম্যাট করতে হবে। রুবির পালানোর চরিত্রটি কী?
কেং

18
একটি জাভাস্ক্রিপ্ট RegExp আক্ষরিক হিসাবে:/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
jpillora

1
@ টুহুল, কমপক্ষে গোফার আর্চির চেয়ে দীর্ঘকাল স্থায়ী ছিল। : - \ (লোকেরা এখনও আঙুল দেয়? 🤔)
Synetech

44

বিষয়ে eyelidness 'উত্তর পোষ্টের লেখা "এই কোনো URI স্পেসিফিকেশন আমার পড়া উপর ভিত্তি করে।": ধন্যবাদ Eyelidness, পুলিশের নির্ভুল সমাধান আমি চাওয়া হয়, যেমন কোনো URI বৈশিষ্ট উপর ভিত্তি করে করা হয়! দুর্দান্ত কাজ। :)

আমাকে দুটি সংশোধন করতে হয়েছিল। প্রিগ_ম্যাচ () ফাংশনটির সাথে পিএইচপি (v5.2.10) এ আইপি ঠিকানার ইউআরএলগুলি সঠিকভাবে মেলানোর জন্য রেগএক্সপেক্স প্রাপ্ত প্রথম।

পাইপের চারপাশে "আইপি অ্যাড্রেস" এর উপরের লাইনে আমাকে আরও একটি সেট বন্ধনী যুক্ত করতে হয়েছিল:

)|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?#

নিশ্চিত কেন।

আমি .co.uk এবং অনুরূপ সমর্থন করতে শীর্ষ স্তরের ডোমেন নূন্যতম দৈর্ঘ্য 3 থেকে 2 অক্ষর থেকে কমিয়েছি।

চূড়ান্ত কোড:

/^(https?|ftp):\/\/(?#                                      protocol
)(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?#         username
)(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?#      password
)@)?(?#                                                     auth requires @
)((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?#             domain segments AND
)[a-z][a-z0-9-]*[a-z0-9](?#                                 top level domain  OR
)|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?#
    )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?#             IP address
))(:\d+)?(?#                                                port
))(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*(?# path
)(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)(?#      query string
)?)?)?(?#                                                   path and query string optional
)(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?(?#      fragment
)$/i

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

পিএইচপি কোড হিসাবে :

define('URL_FORMAT', 
'/^(https?):\/\/'.                                         // protocol
'(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'.         // username
'(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'.      // password
'@)?(?#'.                                                  // auth requires @
')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.                      // domain segments AND
'[a-z][a-z0-9-]*[a-z0-9]'.                                 // top level domain  OR
'|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}'.
'(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'.                 // IP address
')(:\d+)?'.                                                // port
')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'. // path
'(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'.      // query string
'?)?)?'.                                                   // path and query string optional
'(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'.      // fragment
'$/i');

এখানে পিএইচপি-তে একটি পরীক্ষা প্রোগ্রাম রয়েছে যা রেগেক্স ব্যবহার করে বিভিন্ন ইউআরএলকে বৈধতা দেয়:

<?php

define('URL_FORMAT',
'/^(https?):\/\/'.                                         // protocol
'(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'.         // username
'(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'.      // password
'@)?(?#'.                                                  // auth requires @
')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.                      // domain segments AND
'[a-z][a-z0-9-]*[a-z0-9]'.                                 // top level domain  OR
'|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}'.
'(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'.                 // IP address
')(:\d+)?'.                                                // port
')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'. // path
'(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'.      // query string
'?)?)?'.                                                   // path and query string optional
'(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'.      // fragment
'$/i');

/**
 * Verify the syntax of the given URL. 
 * 
 * @access public
 * @param $url The URL to verify.
 * @return boolean
 */
function is_valid_url($url) {
  if (str_starts_with(strtolower($url), 'http://localhost')) {
    return true;
  }
  return preg_match(URL_FORMAT, $url);
}


/**
 * String starts with something
 * 
 * This function will return true only if input string starts with
 * niddle
 * 
 * @param string $string Input string
 * @param string $niddle Needle string
 * @return boolean
 */
function str_starts_with($string, $niddle) {
      return substr($string, 0, strlen($niddle)) == $niddle;
}


/**
 * Test a URL for validity and count results.
 * @param url url
 * @param expected expected result (true or false)
 */

$numtests = 0;
$passed = 0;

function test_url($url, $expected) {
  global $numtests, $passed;
  $numtests++;
  $valid = is_valid_url($url);
  echo "URL Valid?: " . ($valid?"yes":"no") . " for URL: $url. Expected: ".($expected?"yes":"no").". ";
  if($valid == $expected) {
    echo "PASS\n"; $passed++;
  } else {
    echo "FAIL\n";
  }
}

echo "URL Tests:\n\n";

test_url("http://localserver/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", true);
test_url("http://www.google.com", true);
test_url("http://www.google.co.uk/projects/my%20folder/test.php", true);
test_url("https://myserver.localdomain", true);
test_url("http://192.168.1.120/projects/index.php", true);
test_url("http://192.168.1.1/projects/index.php", true);
test_url("http://projectpier-server.localdomain/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", true);
test_url("https://2.4.168.19/project-pier?c=test&a=b", true);
test_url("https://localhost/a/b/c/test.php?c=controller&arg1=20&arg2=20", true);
test_url("http://user:password@localhost/a/b/c/test.php?c=controller&arg1=20&arg2=20", true);

echo "\n$passed out of $numtests tests passed.\n\n";

?>

পুনর্গঠনের জন্য আবার চোখের পলকে ধন্যবাদ !


1
চোখের পলকের উত্তর আমার পক্ষে কাজ করে নি, তবে এইটি করেছে। ধন্যবাদ!
জোশ

এটি একটি জাভাস্ক্রিপ্টে কাজ করে, তবে আমি
ইউএসকেড

5
শো কুওয়ামোটোর মন্তব্য: "আমি ব্যবহারকারীর দ্বারা রেগেক্স ব্যবহার করে শেষ করেছি 244966, যা আমার কাছে পাঠযোগ্য তবে পুরোপুরির নিখুঁত মিশ্রণ However একটি অক্ষরের টুকরোগুলি যেমন t.co ধারণ করে ঠিক করা হয় এই লাইনটি এর ')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.সাথে প্রতিস্থাপন করা ')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'."" আমি এই মন্তব্যের ভিত্তিতে প্রাসঙ্গিক সম্পাদনা করেছি।
পিটার ও।

সুন্দর কাজ করে! যাইহোক আমি কেবলমাত্র টিলড চরিত্রের সাথে পাথের জন্য সমর্থন যোগ করার অনুমতি দিয়েছিলাম (~), এটি পথের সাথে সম্পর্কিত লাইনে যুক্ত করে।
লিও

/^(https?|ftp):(প্রোটোকল) আপনি কেন ডেটা, ফাইল, এসএনএন, ডিসি ++, চৌম্বক, স্কাইপ বা সম্পর্কিত প্লাগইন বা সার্ভার সহ কোনও ব্রাউজার দ্বারা সমর্থিত অন্য কোনও প্রোটোকলকে অস্বীকার করবেন না?
আলেক্সি এফ।

43

ম্যাথিয়াস বাইেনেন্সের প্রচুর নিয়মিত এক্সপ্রেশনগুলির সর্বোত্তম তুলনা করার জন্য একটি দুর্দান্ত নিবন্ধ রয়েছে: নিখুঁত ইউআরএল বৈধতা পুনরায় অনুসন্ধানের জন্য

পোস্ট করা সেরাটি কিছুটা দীর্ঘ, তবে আপনি এটি ফেলে দিতে পারেন এমন কোনও কিছুর সাথে এটি মেলে।

জাভাস্ক্রিপ্ট সংস্করণ

/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i

পিএইচপি সংস্করণ

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$_iuS

1
পিএইচপি ব্যবহারের সাথে প্রিগ_ম্যাচ ব্যবহারের জন্য %^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
টবি বেরেসফোর্ড

এই পৃষ্ঠায়, আমি স্টিফেনহে সমাধানটি পছন্দ করি, কারণ এটি 502 এর পরিবর্তে 38 টি অক্ষর!
ভেন্রিক্স

আইপি ঠিকানাগুলির জন্যও অনুমতি দেয় না
ম্যাট ফ্লেচার

বৈধ দিন (স্ল্যাশ স্ল্যাশ): //www.2test.com/
স্ট্যাকডেভ

33

পোস্টটি একটি ইউআরএল (রেজেক্স) এর অংশগুলি পাওয়া যায় এটির বিভিন্ন উপাদান সনাক্ত করার জন্য একটি ইউআরএল বিশ্লেষণ নিয়ে আলোচনা করে। আপনি যদি ইউআরএলটি সু-গঠিত হয় কিনা তা যদি পরীক্ষা করতে চান তবে এটি আপনার প্রয়োজনের জন্য পর্যাপ্ত হওয়া উচিত।

আপনার যদি এটি সত্যিকারেরভাবে বৈধ কিনা তা খতিয়ে দেখার প্রয়োজন হয়, শেষ পর্যন্ত আপনাকে অন্য প্রান্তে যা আছে তা অ্যাক্সেস করার চেষ্টা করতে হবে।

আপনার সাধারণ কাঠামো বা অন্য লাইব্রেরি দ্বারা সরবরাহ করা কোনও ফাংশন ব্যবহার করে আপনি সম্ভবত আরও ভাল। অনেক প্ল্যাটফর্মের মধ্যে এমন ফাংশন অন্তর্ভুক্ত রয়েছে যা ইউআরএলকে বিশ্লেষণ করে। উদাহরণস্বরূপ, পাইথনের urlparse মডিউল রয়েছে এবং .NET- এ আপনি সিস্টেমটি ব্যবহার করতে পারেন ri ইউরি ক্লাসের নির্মাতা ইউআরএলকে বৈধতা দেওয়ার উপায় হিসাবে।


22

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

পিএইচপি-তে, parse_urlফাংশনটি ব্যবহার করুন ।

পার্ল: URIমডিউল

রুবি: URIমডিউল

। নেট: 'উরি' ক্লাস

রেজেক্সগুলি কোনও ম্যাজিক লাঠি নয় যা আপনি প্রতিটি সমস্যার সাথে যুক্ত হন যা স্ট্রিংগুলিকে জড়িত করে।


7
আপনার শেষ বাক্যটি খুব বেশি আমাকে যন্ত্র / মাসলোর হাতুড়ি সম্পর্কিত আইনটির কথা মনে করিয়ে দেয় : "আপনার সমস্ত কিছু যদি হাতুড়ি হয় তবে সবকিছুই পেরেকের মতো লাগে।"
ডেভিডআরআর

3
Regexes, যদিও, প্লেইন টেক্সট একটি বডি থেকে URL গুলি বের করার জন্য সুন্দর । যদি আপনি সন্দেহ করেন যে স্ট্রিংয়ের সম্পূর্ণতা একটি ইউআরএল, তবে আমি 100% আপনার সাথে একমত হই এবং জাভার সমতুল্য তা উল্লেখ করব java.net.URL
ndm13

2
পিএইচপি রাজ্যে parse_url এর জন্য দস্তাবেজগুলি: এই ফাংশনটি প্রদত্ত ইউআরএলটিকে বৈধতা দেওয়ার জন্য নয়, এটি কেবল এটি উপরের তালিকাভুক্ত অংশগুলিতে বিচ্ছেদ করে।
ডগ আমোস

18

অ-বৈধকরণের ইউআরআই-রেফারেন্স পার্সার

রেফারেন্সের উদ্দেশ্যে, এখানে আইইটিএফ স্পেস: ( টিএক্সটি | এইচটিএমএল ) রয়েছে। বিশেষত, পরিশিষ্ট বি একটি নিয়মিত প্রকাশের সাথে একটি ইউআরআই রেফারেন্সকে পার্সিং করে দেখায় যে কীভাবে বৈধ রেজেক্সকে পার্স করতে হয় । এটি হিসাবে বর্ণিত হয়,

অ-বৈধতাযোগ্য ইউআরআই-রেফারেন্স পার্সারের উদাহরণের জন্য যা কোনও প্রদত্ত স্ট্রিং নেবে এবং ইউআরআই উপাদানগুলি বের করবে।

তারা সরবরাহ করে এমন রেগেক্স এখানে রয়েছে:

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

অন্য কেউ যেমন বলেছে, সম্ভবত আপনি ইতিমধ্যে এটি ব্যবহার করছেন এমন কোনও লাইব / ফ্রেমওয়ার্কে রেখে দেওয়া ভাল।


15
সম্পূর্ণ অকেজো। কেউ কি আমাকে একটি স্ট্রিং দেখাতে পারেন যা এই রেজেক্সের সাথে মেলে না ? (উভয় "#? #? #" বা "<<< >>>" মিলছে। এগুলি কী ধরনের ইউআরআই?)
অ্যালেক্স ডি

3
@ অ্যালেক্সডি আমার কাছে অভিযোগ করবেন না এটি কোনও ইউআরআইয়ের অফিসিয়াল স্পেসিফিকেশন। আইইটিএফ পছন্দ না হলে এটি নিয়ে যান F
হ্যাঙ্ক গে

1
@ অ্যালেক্সডি আমি মনে করি এগুলি আপেক্ষিক উল্লেখ হিসাবে বিবেচিত হতে পারে । আরএফসি 3986 দেখুন, বিভাগ 4.2।
andyg0808

3
@ andyg0808, আপনি ঠিক থাকতে পারেন, তবে সত্যটি রয়ে গেছে যে এই রেজেক্সটি সূর্যের নীচে কার্যত কোনও স্ট্রিংয়ের সাথে মেলে।
অ্যালেক্স ডি

1
এটি একটি ভাল উত্তর নয় কারণ এটি বৈধ নয়, প্রশ্ন অনুসারে। এটি পার্সিং করছে। এগুলি দুটি ভিন্ন ফাংশন। আপনি যদি এই রেজেক্স ট্র্যাশটি দেন তবে এটি পার্স করার চেষ্টা করে। URL টি বৈধ না হলে পার্সিংটি কাজের গ্যারান্টিযুক্ত নয়।
ইভান ক্যারল

15

এটি সমস্ত ইউআরএল মিলবে

  • HTTP / https সহ বা ছাড়াই
  • www এর সাথে বা ছাড়াই

... সাব-ডোমেন এবং সেই নতুন শীর্ষ স্তরের ডোমেন নেম এক্সটেনশনগুলি সহ। যাদুঘর ,। একাডেমি ,। ফাউন্ডেশন ইত্যাদিতে 63৩ টি পর্যন্ত অক্ষর থাকতে পারে (কেবলমাত্র। কম , নেট , তথ্য ইত্যাদি)

(([\w]+:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?

কারণ আজ উপলভ্য শীর্ষ স্তরের ডোমেন নেম এক্সটেনশনের সর্বোচ্চ দৈর্ঘ্য 13 টি অক্ষর characters আন্তর্জাতিক , কেউ এর অপব্যবহার রোধ করতে আপনি প্রকাশের 63 নম্বরটি 13 এ পরিবর্তন করতে পারেন।

জাভাস্ক্রিপ্ট হিসাবে

var urlreg=/(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?/;

$('textarea').on('input',function(){
  var url = $(this).val();
  $(this).toggleClass('invalid', urlreg.test(url) == false)
});

$('textarea').trigger('input');
textarea{color:green;}
.invalid{color:red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea>http://www.google.com</textarea>
<textarea>http//www.google.com</textarea>
<textarea>googlecom</textarea>
<textarea>https://www.google.com</textarea>

উইকিপিডিয়া নিবন্ধ: সমস্ত ইন্টারনেট শীর্ষ স্তরের ডোমেনের তালিকা


কেউ দয়া করে জাভাস্ক্রিপ্ট ব্যবহারের জন্য এটি রূপান্তর করতে পারেন?
ব্যবহারকারীর 1063287

অবশেষে !! কেউ এই উত্তর হিসাবে চিহ্নিত করতে পারেন? বা লিজ এ এটি upvote। আমি যদিও জিনিস, আমি মনে করি না এটি একক অক্ষরের ডোমেনগুলির সাথে মেলে, যেমন t.co। এই কেসগুলি পরিচালনা করতে আপনি কীভাবে এটি সামঞ্জস্য করবেন?
অ্যালকসাই

মনে হচ্ছে এটি HTTP কে ছাড়াই // অনুমতি দেয়:
16'16 0

ম্যাচ টেলিফোন নম্বর এবং ইমেল ঠিকানা কটাক্ষপাত আছে regexr.com/3eosr কপি আটকানো আপনার Regex শুধু সব স্ল্যাশ পলান
ক্যান রাউ

11

আমার জন্য ইউআরএল-এর জন্য সেরা নিয়মিত প্রকাশটি হ'ল:

"(([\w]+:)?//)?(([\d\w]|%[a-fA-F\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?"

এটি মনে করে যে এটি কতটুকু ডোমেইন / ডাব্লু / টি / টি টি গ্রহণ করবে?
রেকটিড

2
ধন্যবাদ! আইওএস-এ আমার জন্য কাজ করা পালানো সংস্করণ এখানে:(([\\w]+:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,4}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?
জেমস কুয়াং

এই রেজেক্সটি কেবলমাত্র 4 টি পর্যন্ত অক্ষরের সাথে প্রত্যয় মেলে এবং আইপি অ্যাড্রেসগুলি (v4 এবং v6), লোকালহোস্ট এবং বিদেশী অক্ষরের সাথে ডোমেন নামগুলিতে ব্যর্থ হয়। আমি আপনার অন্তর্ভুক্তির আকারের পরিসীমা সম্পাদনা করার এবং সর্বনিম্ন পরিবর্তে প্রতিস্থাপন \wকরার পরামর্শ দেব \p{L}
এনডিএম 13

মনে রাখবেন যে এই RegEx কেবলমাত্র " m.sitename.com " এর মতো কেবল একটি অক্ষরের সাবডোমেন থাকা URL গুলি ক্যাপচার করে না । এটি ঠিক করার জন্য, আমাকে এটিকে পরিবর্তন করতে ([\d\w][-\d\w]{0,253}[\d\w]\.)+হয়েছিল ([\d\w][-\d\w]{0,253}[\d\w]?\.)+(এর শেষের দিকে একটি প্রশ্ন চিহ্ন যুক্ত করুন)
ইওভা ফিউয়ারস্টাইন

9
        function validateURL(textval) {
            var urlregex = new RegExp(
            "^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*$");
            return urlregex.test(textval);
        }

ম্যাচগুলি http://site.com/dir/file.php?var=moo |FTP: // ব্যবহারকারী: pass@site.com: 21 / ফাইল / Dir

ম্যাচবিহীন সাইট.কম | http://site.com/dir//


নোট করুন যে আমাদের ইউআরএল [ফাঁকা জায়গা] থাকলে এই রেজেক্সটি মিলবে। উদাহরণ: http://www.goo gle.comমিলবে।
ifch0o1

এই ফাংশনটি কল করার আগে parse_url () ব্যবহার করুন
ব্যবহারকারী 1524615

"/" এর এবং "?" এড়াতে ভুলে যাবেন না, এটির ভাল অনুশীলন এবং এটিকে সামঞ্জস্যপূর্ণ করে তুলতে হবে (যা আমি জানি (যা এই বিষয়ে বেশি নয় :))
স্টিভ পি


7

আমি যে রেজেক্সটি সন্ধান করছিলাম তা সন্ধান করতে সক্ষম হলাম না তাই আমি আমার প্রয়োজনীয়তা পূর্ণ করার জন্য একটি রেজেক্সকে সংশোধন করেছিলাম এবং সম্ভবত এটি এখন ঠিকঠাক কাজ করছে বলে মনে হচ্ছে। আমার প্রয়োজনীয়তাগুলি ছিল:

  • ইউআরএলগুলি ডাব্লু / ও প্রোটোকল (www.gooogle.com) এর সাথে মিল দিন
  • ক্যোয়ারী প্যারামিটার এবং পাথের সাথে ইউআরএলগুলি মিল করুন ( http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e )
  • ইউআরএলগুলি মেলে না যেখানে গ্রহণযোগ্য অক্ষর নেই (উদাহরণস্বরূপ "'£):

এখানে আমি কী নিয়ে এসেছি, কোনও পরামর্শ প্রশংসাযোগ্য:

@Test
    public void testWebsiteUrl(){
        String regularExpression = "((http|ftp|https):\\/\\/)?[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&amp;:/~\\+#]*[\\w\\-\\@?^=%&amp;/~\\+#])?";

        assertTrue("www.google.com".matches(regularExpression));
        assertTrue("www.google.co.uk".matches(regularExpression));
        assertTrue("http://www.google.com".matches(regularExpression));
        assertTrue("http://www.google.co.uk".matches(regularExpression));
        assertTrue("https://www.google.com".matches(regularExpression));
        assertTrue("https://www.google.co.uk".matches(regularExpression));
        assertTrue("google.com".matches(regularExpression));
        assertTrue("google.co.uk".matches(regularExpression));
        assertTrue("google.mu".matches(regularExpression));
        assertTrue("mes.intnet.mu".matches(regularExpression));
        assertTrue("cse.uom.ac.mu".matches(regularExpression));

        assertTrue("http://www.google.com/path".matches(regularExpression));
        assertTrue("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e".matches(regularExpression));
        assertTrue("http://www.google.com/?queryparam=123".matches(regularExpression));
        assertTrue("http://www.google.com/path?queryparam=123".matches(regularExpression));

        assertFalse("www..dr.google".matches(regularExpression));

        assertFalse("www:google.com".matches(regularExpression));

        assertFalse("https://www@.google.com".matches(regularExpression));

        assertFalse("https://www.google.com\"".matches(regularExpression));
        assertFalse("https://www.google.com'".matches(regularExpression));

        assertFalse("http://www.google.com/path'".matches(regularExpression));
        assertFalse("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e'".matches(regularExpression));
        assertFalse("http://www.google.com/?queryparam=123'".matches(regularExpression));
        assertFalse("http://www.google.com/path?queryparam=12'3".matches(regularExpression));

    }

+1, লোকেরা যখন পরীক্ষার কেস যুক্ত করে; ফ্লাইয়ের রেজেক্সটি বোঝার চেষ্টা করার চেয়ে চোখের ছোঁয়া খেলা এত সহজ।
দাউদ হে

7

আপনি যদি সত্যিই চূড়ান্ত ম্যাচটি অনুসন্ধান করেন তবে আপনি সম্ভবত এটি " একটি ভাল ইউআরএল রেগুলার এক্সপ্রেশন? " তে পেয়েছেন।

তবে একটি রেইজেক্স যা সত্যই সম্ভাব্য সমস্ত ডোমেনের সাথে মেলে এবং আরএফসি অনুসারে অনুমোদিত যে কোনও কিছুকে মারাত্মক দীর্ঘ এবং অপঠনযোগ্য, আমার বিশ্বাস করুন ;-)


5

আমি নিয়মিত এক্সপ্রেশন ব্যবহার করে ইউআরআই বৈধতা নিয়ে আলোচনা করার জন্য একটি গভীর-নিবন্ধে কাজ করছি। এটি আরএফসি 3986 এর উপর ভিত্তি করে।

নিয়মিত এক্সপ্রেশন ইউআরআই বৈধকরণ

নিবন্ধটি এখনও সম্পূর্ণ না হলেও, আমি একটি পিএইচপি ফাংশন নিয়ে এসেছি যা এইচটিটিপি এবং এফটিপি ইউআরএল যাচাই করার জন্য বেশ ভাল কাজ করে। বর্তমান সংস্করণটি এখানে:

// function url_valid($url) { Rev:20110423_2000
//
// Return associative array of valid URI components, or FALSE if $url is not
// RFC-3986 compliant. If the passed URL begins with: "www." or "ftp.", then
// "http://" or "ftp://" is prepended and the corrected full-url is stored in
// the return array with a key name "url". This value should be used by the caller.
//
// Return value: FALSE if $url is not valid, otherwise array of URI components:
// e.g.
// Given: "http://www.jmrware.com:80/articles?height=10&width=75#fragone"
// Array(
//    [scheme] => http
//    [authority] => www.jmrware.com:80
//    [userinfo] =>
//    [host] => www.jmrware.com
//    [IP_literal] =>
//    [IPV6address] =>
//    [ls32] =>
//    [IPvFuture] =>
//    [IPv4address] =>
//    [regname] => www.jmrware.com
//    [port] => 80
//    [path_abempty] => /articles
//    [query] => height=10&width=75
//    [fragment] => fragone
//    [url] => http://www.jmrware.com:80/articles?height=10&width=75#fragone
// )
function url_valid($url) {
    if (strpos($url, 'www.') === 0) $url = 'http://'. $url;
    if (strpos($url, 'ftp.') === 0) $url = 'ftp://'. $url;
    if (!preg_match('/# Valid absolute URI having a non-empty, valid DNS host.
        ^
        (?P<scheme>[A-Za-z][A-Za-z0-9+\-.]*):\/\/
        (?P<authority>
          (?:(?P<userinfo>(?:[A-Za-z0-9\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?
          (?P<host>
            (?P<IP_literal>
              \[
              (?:
                (?P<IPV6address>
                  (?:                                                (?:[0-9A-Fa-f]{1,4}:){6}
                  |                                                ::(?:[0-9A-Fa-f]{1,4}:){5}
                  | (?:                          [0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::   [0-9A-Fa-f]{1,4}:
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::
                  )
                  (?P<ls32>[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}
                  | (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
                       (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
                  )
                |   (?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::   [0-9A-Fa-f]{1,4}
                |   (?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::
                )
              | (?P<IPvFuture>[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&\'()*+,;=:]+)
              )
              \]
            )
          | (?P<IPv4address>(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
                               (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
          | (?P<regname>(?:[A-Za-z0-9\-._~!$&\'()*+,;=]|%[0-9A-Fa-f]{2})+)
          )
          (?::(?P<port>[0-9]*))?
        )
        (?P<path_abempty>(?:\/(?:[A-Za-z0-9\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)
        (?:\?(?P<query>       (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
        (?:\#(?P<fragment>    (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
        $
        /mx', $url, $m)) return FALSE;
    switch ($m['scheme']) {
    case 'https':
    case 'http':
        if ($m['userinfo']) return FALSE; // HTTP scheme does not allow userinfo.
        break;
    case 'ftps':
    case 'ftp':
        break;
    default:
        return FALSE;   // Unrecognized URI scheme. Default to FALSE.
    }
    // Validate host name conforms to DNS "dot-separated-parts".
    if ($m['regname']) { // If host regname specified, check for DNS conformance.
        if (!preg_match('/# HTTP DNS host name.
            ^                      # Anchor to beginning of string.
            (?!.{256})             # Overall host length is less than 256 chars.
            (?:                    # Group dot separated host part alternatives.
              [A-Za-z0-9]\.        # Either a single alphanum followed by dot
            |                      # or... part has more than one char (63 chars max).
              [A-Za-z0-9]          # Part first char is alphanum (no dash).
              [A-Za-z0-9\-]{0,61}  # Internal chars are alphanum plus dash.
              [A-Za-z0-9]          # Part last char is alphanum (no dash).
              \.                   # Each part followed by literal dot.
            )*                     # Zero or more parts before top level domain.
            (?:                    # Explicitly specify top level domains.
              com|edu|gov|int|mil|net|org|biz|
              info|name|pro|aero|coop|museum|
              asia|cat|jobs|mobi|tel|travel|
              [A-Za-z]{2})         # Country codes are exactly two alpha chars.
              \.?                  # Top level domain can end in a dot.
            $                      # Anchor to end of string.
            /ix', $m['host'])) return FALSE;
    }
    $m['url'] = $url;
    for ($i = 0; isset($m[$i]); ++$i) unset($m[$i]);
    return $m; // return TRUE == array of useful named $matches plus the valid $url.
}

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


আমি কৌতূহলী যে আপনি কেন আইআরআই আরএফসি 3986 এর পরিবর্তে ইউআরআই আরএফসি 3986 অনুসরণ করেছেন।
চোখের পলকহীনতা

@ আইলিডলেসনেস - ভাল প্রশ্ন আমি আসলে আইআরআই-তে পারদর্শী নই। যে আরএফসি নির্দেশ করার জন্য ধন্যবাদ। আমি দেখতে পেয়েছি যে আরএফসি 3987 অনুসারে: "... এইচটিটিপি প্রোটোকল [আরএফসি 2616] তে, অনুরোধ ইউআরআই একটি ইউআরআই হিসাবে সংজ্ঞায়িত করা হয়েছে, যার অর্থ এইচটিটিপি অনুরোধে আইআরআইয়ের সরাসরি ব্যবহারের অনুমতি নেই।" সুতরাং এইচটিটিপি এর মাধ্যমে প্রেরণের আগে একটি আইআরআই আসলে ইউআরআই হিসাবে এনকোড থাকে। তাই আপাতত, সর্বদা ইউআরআই বৈধকরণের প্রয়োজন হবে। সম্ভবত আমি পরবর্তী তারিখে আইআরআই বৈধতা মোকাবেলা করব। মন্তব্যের জন্য ধন্যবাদ!
রডগারুনার

@ridgerunner, 2616 এর উল্লেখটি পুরানো। আইআরআইগুলি আইআরআই হিসাবে প্রেরণ করা হয়, আইআরআইরা অনুমতি দেয় এমন সমস্ত অক্ষর এবং ইউআরআই না দেয়। আমি "মানব পঠনযোগ্য" প্যাটার্ন তৈরির প্রয়াসকে প্রশংসা করি (এবং আমি নিজেই এটিতে কাজ করেছি তবে পর্যাপ্ত পরীক্ষার সুযোগ পাইনি) তবে ২০১২ সালে এবং ২০১৩ সালে পশ্চিমা অক্ষরগুলিতে ঠিকানা সীমাবদ্ধ করা মেনে নেওয়া যায় না যদিও- পাশ্চাত্য অক্ষরগুলি আসলে পাথ, টুকরা এবং এমনকি ডোমেনগুলিতে বিস্তৃত ব্যবহারে use
চোখের পলকহীনতা

@ আইলিডলেসনেস - আমার ধারণা এটিকে আরও ঘনিষ্ঠভাবে দেখার দরকার। সতর্ক থাকুন জন্য ধন্যবাদ।
রাজারগনার

@ রিডারজার্নার, চিয়ার্স! আমি ক্ষমা চেয়ে নিচ্ছি যদি আমি অভদ্র হয়ে উপস্থিত হই, তবে মদ্যপানের পরে আমার মন্তব্য করা উচিত নয়! আমি একটি মানব-পঠনযোগ্য প্যাটার্ন তৈরির প্রচেষ্টাকে প্রশংসা করি এবং আপনি আমার উত্সাহ অর্জন করেছেন।
চোখের পলকহীনতা

5

আমি একটি সামান্য গ্রোভি সংস্করণ লিখেছি যা আপনি চালাতে পারেন

এটি নিম্নলিখিত url- এর সাথে মেলে (যা আমার পক্ষে যথেষ্ট ভাল)

public static void main(args){
        String url = "go to http://www.m.abut.ly/abc its awesome"
        url = url.replaceAll(/https?:\/\/w{0,3}\w*?\.(\w*?\.)?\w{2,3}\S*|www\.(\w*?\.)?\w*?\.\w{2,3}\S*|(\w*?\.)?\w*?\.\w{2,3}[\/\?]\S*/ , { it ->
            "woof${it}woof"
        })
        println url

    }

http://google.com

http://google.com/help.php

http://google.com/help.php?a=5

http://www.google.com

http://www.google.com/help.php

http://www.google.com?a=5

google.com?a=5

google.com/help.php

google.com/help.php?a=5

http://www.m.google.com/help.php?a=5 (এবং এর সমস্ত অনুমতি)

www.m.google.com/help.php?a=5 (এবং এর সমস্ত অনুমতি)

m.google.com/help.php?a=5 (এবং এর সমস্ত অনুমতি)

HTTP বা www দিয়ে শুরু করবেন না এমন যে কোনও url- এর জন্য গুরুত্বপূর্ণ বিষয়টি হ'ল তাদের অবশ্যই একটি / অথবা অন্তর্ভুক্ত করা উচিত?

আমি বাজি ধরছি এটি আরও কিছুটা টুইট করা যায় তবে এটি এত সংক্ষিপ্ত এবং কমপ্যাক্ট হওয়ার জন্য কাজটি বেশ সুন্দর করে তোলে ... কারণ আপনি এটিকে 3 তে বিভক্ত করতে পারেন:

http: https?: // w {0,3} \ w *?। \ w {2,3} \ S * দিয়ে শুরু হওয়া এমন কোনও কিছু সন্ধান করুন

www: www। starts w *?। \ w {2,3} * S * দিয়ে শুরু হওয়া যে কোনও কিছু সন্ধান করুন

বা এমন কিছু খুঁজে পান যার একটি টেক্সট অবশ্যই একটি বিন্দু এবং তারপর কমপক্ষে 2 টি অক্ষর এবং তারপরে একটি? বা /: \ ডব্লু *?। \ ডাব্লু {২,৩} [/ \?] \ এস *


1
-ইউআরএলে এটির কোনও সমর্থন নেই ।
nhahtdh

5

আমি এই রেজেক্স ব্যবহার করি:

((https?:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?

উভয় সমর্থন করতে:

http://stackoverflow.com
https://stackoverflow.com

এবং:

//stackoverflow.com

2
আমাকে আপনার রেজেক্স আপডেট করতে হয়েছিল। তৃতীয় '?' সমস্ত ধরণের পাঠ্য নির্বাচন করার অনুমতি দিচ্ছিল। এটি অপসারণের পরে কেবল 'http', 'https' বা '//' নির্বাচন করা হয়েছিল। আমি এটি সংশোধন করেছি যাতে এটি '/' এর তুলনামূলক URL এ কাজ করে। এবং ফরোয়ার্ড স্ল্যাশ পালাতে। ((https?:)?(\/?\/))(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
মার্কাস

1
ক্যাপচারিং গ্রুপগুলি আপডেট করেছে যাতে তারা আরও কার্যকর হতে পারে: ((?:https?:)?(?:\/?\/))((?:[\d\w]|%[a-fA-f\d]{2,2})+(?::(?:[\d\w]|%[a-fA-f\d]{2,2})+)?@)?((?:[\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63})(:[\d]+)?(\/(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(?:&?(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
প্যানেক

5

এখানে একটি ভাল নিয়ম যা সমস্ত সম্ভাব্য কেসগুলি জুড়ে: পোর্ট, প্যারাম এবং ইত্যাদি

/(https?:\/\/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])(:?\d*)\/?([a-z_\/0-9\-#.]*)\??([a-z_\/0-9\-#=&]*)/g

দুর্ভাগ্যক্রমে, এই ইউআরএলে rayliverified.com?url=https%3A%2F%2Fbing.com-
রায় লি

4

এটি আমার জন্য খুব ভাল কাজ করে। (https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?


4

এখানে অ্যানড্রয়েড উত্স কোড থেকে প্রস্তুত প্রস্তুত জাভা সংস্করণ। এটি আমি খুঁজে পেয়েছি সেরা।

public static final Matcher WEB  = Pattern.compile(new StringBuilder()                 
.append("((?:(http|https|Http|Https|rtsp|Rtsp):")                      
.append("\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)")                         
.append("\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_")                         
.append("\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?")                         
.append("((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+")   // named host                            
.append("(?:")   // plus top level domain                         
.append("(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])")                         
.append("|(?:biz|b[abdefghijmnorstvwyz])")                         
.append("|(?:cat|com|coop|c[acdfghiklmnoruvxyz])")                         
.append("|d[ejkmoz]")                         
.append("|(?:edu|e[cegrstu])")                         
.append("|f[ijkmor]")                         
.append("|(?:gov|g[abdefghilmnpqrstuwy])")                         
.append("|h[kmnrtu]")                         
.append("|(?:info|int|i[delmnoqrst])")                         
.append("|(?:jobs|j[emop])")                         
.append("|k[eghimnrwyz]")                         
.append("|l[abcikrstuvy]")                         
.append("|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])")                         
.append("|(?:name|net|n[acefgilopruz])")                         
.append("|(?:org|om)")                         
.append("|(?:pro|p[aefghklmnrstwy])")                         
.append("|qa")                         
.append("|r[eouw]")                         
.append("|s[abcdeghijklmnortuvyz]")                         
.append("|(?:tel|travel|t[cdfghjklmnoprtvwz])")                         
.append("|u[agkmsyz]")                         
.append("|v[aceginu]")                         
.append("|w[fs]")                         
.append("|y[etu]")                         
.append("|z[amw]))")                         
.append("|(?:(?:25[0-5]|2[0-4]") // or ip address                                                 
.append("[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]")                             
.append("|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]")                         
.append("[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}")                         
.append("|[1-9][0-9]|[0-9])))")                         
.append("(?:\\:\\d{1,5})?)") // plus option port number                             
.append("(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~")  // plus option query params                         
.append("\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?")                         
.append("(?:\\b|$)").toString()                 
).matcher("");

এই "নূতন gTLD" সাথে কাজ করে না, চেক en.wikipedia.org/wiki/List_of_Internet_top-level_domains & newgtlds.icann.org/en/program-status/delegated-stringsটিএলডির হার্ডকোডিং তালিকাটি খারাপ অনুশীলন ... কিছু সর্বজনীন প্রত্যয় তালিকাগুলি পাওয়া যায়, এর মধ্যে রয়েছে টিএলডি এর সাম্প্রতিকতম রূপ: পাবলিকসফিক্স.অর্গ.অর্গ (ফায়ারফক্স, ক্রোম, আইআই তে ব্যবহৃত)
ওএসজিএক্স

এটি দেখে আমার প্রথম চিন্তা ছিল: ওভারকিলের মতো কোনও হত্যা নেই। তারা আক্ষরিক অর্থে সমস্ত সিসিটিএলডি নিয়েছিল এবং তাদের সাথে বিশেষভাবে মেলে একটি রেইগেক্স তৈরি করেছে। আমি বিশ্বাস করি মিথ্যা ধনাত্মক বিষয়গুলি কেটে ফেলা হয়েছে, তবে পরিস্থিতিটি পরিচালনা করার একটি ভয়ঙ্কর উপায়।
ndm13

4

এখানে আমি তৈরি একটি রেইজেক্স যা কোনও ইউআরএল থেকে বিভিন্ন অংশ কেটে নিয়ে যায়:

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

((?:https?|ftp):\/\/?)?(গোষ্ঠী 1) : প্রোটোকল বের করে
([^:/\s.]+\.[^:/\s]|localhost)(গোষ্ঠী 2) : হোস্টনামটি বের করে
(:\d+)?(গোষ্ঠী 3) : পোর্ট নম্বরটি বের করে
((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?(গ্রুপ 4 এবং 5) : পথ অংশটি বের করে
([^#]+)?(গ্রুপ 6) : ক্যোয়ারী অংশটি বের করে
(#[\w-]+)? (গ্রুপ 7) : হ্যাশ অংশ আহরণ

উপরে তালিকাভুক্ত রেজেক্সের প্রতিটি অংশের জন্য, আপনি শেষটি সরাতে পারেন ? এটিকে বাধ্য করার (বা এটিকে অঙ্গভঙ্গি করতে একটি যোগ করুন)। আপনি ^শুরুতে এবং $রেজেক্সের শেষেও সরাতে পারেন যাতে এটি পুরো স্ট্রিংয়ের সাথে মেলে না।

এটি দেখুন regex101 এ দেখুন

দ্রষ্টব্য: এই রেজেক্সটি 100% নিরাপদ নয় এবং এমন কিছু স্ট্রিং গ্রহণ করতে পারে যা প্রয়োজনীয় বৈধ ইউআরএল নয় তবে এটি কিছু মানদণ্ডকে বৈধতা দেয়। এটির মূল লক্ষ্যটি ছিল কোনও ইউআরএলের বিভিন্ন অংশ যাচাই করা নয়।


ধন্যবাদ। এই উত্তরগুলির জন্য গ্রুপ পন্থা সবচেয়ে ভাল। পরের পৃষ্ঠায় লিঙ্কিত এই নিবন্ধটির দিকনির্দেশনা এবং "100% নিরাপদ নয়" এর একটি সংশোধনী অনুসরণের আপডেটের জন্য এখানে প্রত্যাশা করা হচ্ছে । 99,9% এর মতো একটি মাপদণ্ড বেশিরভাগ পাঠকের পক্ষে যথেষ্ট। : পি
লরি স্টার্ন

3

পাইথনের জন্য, এটি আসল ইউআরএল যায়েটিং রেগেক্স জাঙ্গো 1.5.1.1 এ ব্যবহৃত:

import re
regex = re.compile(
        r'^(?:http|ftp)s?://'  # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'  # domain...
        r'localhost|'  # localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|'  # ...or ipv4
        r'\[?[A-F0-9]*:[A-F0-9:]+\]?)'  # ...or ipv6
        r'(?::\d+)?'  # optional port
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)

এটি ipv4 এবং ipv6 ঠিকানার পাশাপাশি পোর্ট এবং জিইটি প্যারামিটার উভয়ই করে।

পাওয়া.অনুবাদ কোড এখানে , লাইন 44।


3

আমি ইউআরএলগুলির জন্য নিম্নলিখিত রেইজেক্সটি পেয়েছি, 500+ ইউআরএল সহ সফলভাবে পরীক্ষিত :

/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi

আমি জানি এটি দেখতে কুৎসিত দেখাচ্ছে, তবে ভাল জিনিসটি এটি কার্যকর করে। :)

Regex101 এ 581 এলোমেলো URL সহ ব্যাখ্যা এবং ডেমো ।

উত্স: নিখুঁত ইউআরএল বৈধতা রেগেক্সের অনুসন্ধানে


3
আপনার রেজেক্স 155'000 পদক্ষেপে কাজ করছে। এখানে আরেকটি রেইজেক্স রয়েছে যা আপনার 19'000 পদক্ষেপে regex101 লিঙ্কে সরবরাহিত সমস্ত 580 ইউআরএল মূল্যায়ন করছে :/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&amp;:\/~+#()!-]*)([\w@?^=%&amp;\/~+#()!-]))?/gi
জোনাথন মাইম

2

আমি আমার ইউআরএল সংস্করণ তৈরি করার চেষ্টা করেছি। আমার প্রয়োজনীয়তাটি এমন একটি স্ট্রিংয়ের দৃষ্টান্তগুলি ক্যাপচার করা ছিল যেখানে সম্ভব ইউআরএল cse.uom.ac.mu হতে পারে - উল্লেখ করে যে এটি HTTP বা www দ্বারা পূর্ববর্তী নয় is

String regularExpression = "((((ht{2}ps?://)?)((w{3}\\.)?))?)[^.&&[a-zA-Z0-9]][a-zA-Z0-9.-]+[^.&&[a-zA-Z0-9]](\\.[a-zA-Z]{2,3})";

assertTrue("www.google.com".matches(regularExpression));
assertTrue("www.google.co.uk".matches(regularExpression));
assertTrue("http://www.google.com".matches(regularExpression));
assertTrue("http://www.google.co.uk".matches(regularExpression));
assertTrue("https://www.google.com".matches(regularExpression));
assertTrue("https://www.google.co.uk".matches(regularExpression));
assertTrue("google.com".matches(regularExpression));
assertTrue("google.co.uk".matches(regularExpression));
assertTrue("google.mu".matches(regularExpression));
assertTrue("mes.intnet.mu".matches(regularExpression));
assertTrue("cse.uom.ac.mu".matches(regularExpression));

//cannot contain 2 '.' after www
assertFalse("www..dr.google".matches(regularExpression));

//cannot contain 2 '.' just before com
assertFalse("www.dr.google..com".matches(regularExpression));

// to test case where url www must be followed with a '.'
assertFalse("www:google.com".matches(regularExpression));

// to test case where url www must be followed with a '.'
//assertFalse("http://wwwe.google.com".matches(regularExpression));

// to test case where www must be preceded with a '.'
assertFalse("https://www@.google.com".matches(regularExpression));

12
আপনি ht{2}ps?বরং এরপরেই ব্যবহার করুনhttps?
রোই গাভিরেল

2
এটি একই ফলাফল দেওয়া উচিত, তবে হ্যাঁ আপনি ঠিক বলেছেন। তবে আমি নিয়মিত অভিব্যক্তির পরীক্ষামূলক পর্যায়ে ছিলাম এবং এর সমস্ত বাক্য গঠন চেষ্টা করতে চেয়েছিলাম। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
আশীষ

আপনি কি দয়া করে আমাকে কোয়েরির প্যারামিটার এবং অন্য পথের সাথে মেলে এমন একটি রেজেেক্স সরবরাহ করতে সহায়তা করতে পারেন? "www.awebsite.com/path?param=value"
থার্মজ

2

সরল ও সরল FILTER_VALIDATE_URL এ কী ভুল?

 $url = "http://www.example.com";

if(!filter_var($url, FILTER_VALIDATE_URL))
  {
  echo "URL is not valid";
  }
else
  {
  echo "URL is valid";
  }

আমি এটি সঠিকভাবে জানি না তবে যখন ইউআরএলগুলি যাচাই করা দরকার তখন এটি আমার জন্য কাজ করেছিল যাতে ভেবেছিল যে এটি একই জিনিসটির সন্ধানে এই পোস্ট জুড়ে আসা অন্যদের জন্য এটি দরকারী হতে পারে


1
এই প্রশ্নটি একটি রেজিপ্স্পের সন্ধান করছে তবে আপনি কিছু ফিল্টার ধ্রুবক ব্যবহারের পরামর্শ দিচ্ছেন। আপনি কী জানেন যে এটি কীভাবে অভ্যন্তরীণভাবে লিঙ্কগুলি অনুসন্ধান করে?
কুইત્সি

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


2

এটি আমার জন্য কাজ করে এটি ব্যবহার করুন

function validUrl(Url) {
    var myRegExp  =/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i;

    if (!RegExp.test(Url.value)) {
        $("#urlErrorLbl").removeClass('highlightNew');
        return false;
    } 

    $("#urlErrorLbl").addClass('highlightNew'); 
    return true; 
}

2

সুবিধার জন্য এখানে ইউআরএল-এর জন্য একটি ওয়ান-লাইনারের রেজিএক্সপ্যাক্স এমন লোকালহোস্টের সাথেও মিলবে যেখানে আপনার পোর্টের চেয়ে বেশি .comবা অনুরূপ সম্ভাবনা রয়েছে।

(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,6}|:[0-9]{3,4})\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)

2

আপনি কোন ভাষাটি ব্যবহার করছেন তা নির্দিষ্ট করে দেবেন না। যদি পিএইচপি হয় তবে তার জন্য একটি দেশীয় ফাংশন রয়েছে:

$url = 'http://www.yoururl.co.uk/sub1/sub2/?param=1&param2/';

if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
    // Wrong
}
else {
    // Valid
}

ফিল্টার ডেটা, বা ফিল্টার ব্যর্থ হলে FALSE প্রদান করে।

এটি এখানে দেখুন >>

আশা করি এটা সাহায্য করবে.

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