স্ট্রিংটি বৈধ ইউআরএল কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
উদাহরণ স্বরূপ:
http://hello.it => yes
http:||bra.ziz, => no
এটি যদি কোনও বৈধ ইউআরএল হয় তবে আমি কীভাবে এটি পরীক্ষা করতে পারি যে এটি কোনও চিত্রের ফাইলের সাথে সম্পর্কিত কিনা?
স্ট্রিংটি বৈধ ইউআরএল কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
উদাহরণ স্বরূপ:
http://hello.it => yes
http:||bra.ziz, => no
এটি যদি কোনও বৈধ ইউআরএল হয় তবে আমি কীভাবে এটি পরীক্ষা করতে পারি যে এটি কোনও চিত্রের ফাইলের সাথে সম্পর্কিত কিনা?
উত্তর:
URIরুবির সাথে বিতরণ করা মডিউলটি ব্যবহার করুন :
require 'uri'
if url =~ URI::regexp
# Correct URL
end
ভালো লেগেছে আলেকজান্ডার Günther মন্তব্য বলেন, এটা পরীক্ষা করে যদি একটি স্ট্রিং রয়েছে একটি URL।
পরীক্ষা করার জন্য যদি স্ট্রিং হয় একটি URL ব্যবহার করুন:
url =~ /\A#{URI::regexp}\z/
আপনি যদি কেবল ওয়েব ইউআরএল ( httpবা https) পরীক্ষা করতে চান তবে এটি ব্যবহার করুন:
url =~ /\A#{URI::regexp(['http', 'https'])}\z/
'http://:5984/asdf' =~ URI::regexpএবং 'http::5984/asdf' =~ URI::regexpউভয়ই ফিরে আসবে I
"http:"এই রেজিপ্সকে পাস করে।
উপরের উত্তরের অনুরূপ, আমি এই রেজেক্সটি কিছুটা আরও নির্ভুল হিসাবে ব্যবহার করতে দেখছি:
URI::DEFAULT_PARSER.regexp[:ABS_URI]
এটি URI.regexpকোনও কারণে ফাঁকা স্থানগুলিকে অনুমতি দেয় এর বিপরীতে স্পেস সহ ইউআরএলকে অকার্যকর করবে ।
আমি সম্প্রতি একটি শর্টকাট পেয়েছি যা বিভিন্ন ইউআরআই আরজিএক্সপিএসের জন্য সরবরাহ করা হয়। আপনি যে কোনও থেকে URI::DEFAULT_PARSER.regexp.keysসরাসরি অ্যাক্সেস করতে পারেন URI::#{key}।
উদাহরণস্বরূপ, :ABS_URIregexp থেকে অ্যাক্সেস করা যেতে পারে URI::ABS_URI।
/^#{URI.regexp}$/। ঝামেলা হ'ল URI.regexpনোঙ্গর করে না। কোনও স্থানের সাথে একটি স্ট্রিং ইউআরআইয়ের অংশ হিসাবে স্থানটিকে বৈধতা দিচ্ছে না, তবে সমস্ত কিছু স্থান পর্যন্ত নিয়ে যাচ্ছে। যদি সেই খণ্ডটি বৈধ ইউআরআইয়ের মতো দেখায়, ম্যাচটি সফল হয়।
'http://:5984/asdf' =~ URI::DEFAULT_PARSER.regexp[:ABS_URI]0 দেয়, শূন্য নয়; 'http::5984/asdf'=~ URI::DEFAULT_PARSER.regexp[:ABS_URI]0 দেয়; 'http://:5984/asdf' =~ /^#{URI.regexp}$/0 দেয়; 'http::5984/asdf' =~ /^#{URI.regexp}$/0 দেয় পাশাপাশি। উপরের কোনটিই রেগেক্সপস পুরোপুরি সঠিক নয়, তবে তারা কেবল খুব বিজোড় পরিস্থিতিতে ব্যর্থ হয় এবং বেশিরভাগ ক্ষেত্রে এটি কোনও বড় বিষয় নয়।
URI::DEFAULT_PARSER.regexp[:ABS_URI]অভিন্ন হয়/\A\s*#{URI::regexp}\s*\z/
বর্তমান উত্তরগুলির সাথে সমস্যাটি হ'ল কোনও ইউআরআই কোনও URL নয় ।
একটি ইউআরআই আরও একটি লোকেটর, নাম, বা উভয় হিসাবে শ্রেণীবদ্ধ করা যেতে পারে। "ইউনিফর্ম রিসোর্স লোকেটার" (ইউআরএল) শব্দটি ইউআরআইয়ের উপসেটকে বোঝায় যে একটি উত্স সনাক্তকরণের পাশাপাশি, প্রাথমিক অ্যাক্সেস মেকানিজম (উদাহরণস্বরূপ, এর নেটওয়ার্ক "অবস্থান") বর্ণনা করে সংস্থানটি চিহ্নিত করার একটি উপায় সরবরাহ করে a
যেহেতু ইউআরএলগুলি ইউআরআইয়ের একটি উপসেট, এটি স্পষ্ট যে ইউআরআইয়ের সাথে বিশেষত মিলানো অনাকাঙ্ক্ষিত মানগুলির সাথে সফলভাবে মিলবে। উদাহরণস্বরূপ, ইউআরএনস :
"urn:isbn:0451450523" =~ URI::regexp
=> 0
এটি বলা হচ্ছে, যতদূর আমি জানি, রুবির ইউআরএলগুলি বিশ্লেষণের কোনও ডিফল্ট উপায় নেই, সুতরাং সম্ভবত এটি করার জন্য আপনার কোনও রত্নের প্রয়োজন হবে। আপনার যদি বিশেষত এইচটিটিপি বা এইচটিটিপিএস ফর্ম্যাটে ইউআরএলগুলি মেলানোর দরকার হয় তবে আপনি এটির মতো কিছু করতে পারেন:
uri = URI.parse(my_possible_url)
if uri.kind_of?(URI::HTTP) or uri.kind_of?(URI::HTTPS)
# do your stuff
end
uri.kind_of?(URI::HTTP)কমপক্ষে রুবি ১.৯.৩ এ উভয় ক্ষেত্রেই (HTTP এবং https) পর্যাপ্ত বলে মনে হচ্ছে।
URI.parse(string_to_be_checked).kind_of?(URI::HTTP)কাজটি ভাল করে।
http:///neopets.comযা দুর্ভাগ্যক্রমেও বৈধ। হোস্টনামের উপস্থিতি যাচাই করা এটি ঠিক করে দেয়:uri = URI(str) ; %w[http https].include?(uri.scheme) && !uri.host.nil?
আমি ঠিকানাযোগ্য রত্নটিকে পছন্দ করি । আমি খুঁজে পেয়েছি যে এটি URL গুলি আরও বুদ্ধিমানভাবে পরিচালনা করে।
require 'addressable/uri'
SCHEMES = %w(http https)
def valid_url?(url)
parsed = Addressable::URI.parse(url) or return false
SCHEMES.include?(parsed.scheme)
rescue Addressable::URI::InvalidURIError
false
end
Addressable::URI.parseঅবৈধ ইনপুট দিয়ে শূন্য করে না।
এটি মোটামুটি পুরানো এন্ট্রি, তবে আমি ভেবেছিলাম যে আমি এগিয়ে গিয়ে অবদান রাখব:
String.class_eval do
def is_valid_url?
uri = URI.parse self
uri.kind_of? URI::HTTP
rescue URI::InvalidURIError
false
end
end
এখন আপনি যেমন কিছু করতে পারেন:
if "http://www.omg.wtf".is_valid_url?
p "huzzah!"
end
http:/যা আপনি যা চান তা নাও হতে পারে।
আমার জন্য, আমি এই নিয়মিত প্রকাশটি ব্যবহার করি:
/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
বিকল্প:
i - কেস সংবেদনশীলx - রেজিজেস সাদা স্থান উপেক্ষা করুনইউআরএল বৈধতা যাচাই করতে আপনি এই পদ্ধতিটি সেট করতে পারেন:
def valid_url?(url)
return false if url.include?("<script")
url_regexp = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
url =~ url_regexp ? true : false
end
এটি ব্যবহার করতে:
valid_url?("http://stackoverflow.com/questions/1805761/check-if-url-is-valid-ruby")
ভুল ইউআরএল দিয়ে পরীক্ষা করা:
http://ruby3arabi - ফলাফলটি অবৈধhttp://http://ruby3arabi.com - ফলাফলটি অবৈধhttp:// - ফলাফলটি অবৈধhttp://test.com\n<script src=\"nasty.js\"> (কেবলমাত্র "<স্ক্রিপ্ট" পরীক্ষা করুন)সঠিক URL গুলি দিয়ে পরীক্ষা করুন:
http://ruby3arabi.com - ফলাফল বৈধhttp://www.ruby3arabi.com - ফলাফল বৈধhttps://www.ruby3arabi.com - ফলাফল বৈধhttps://www.ruby3arabi.com/article/1 - ফলাফল বৈধhttps://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - ফলাফল বৈধ"http://test.com\n<script src=\"nasty.js\">"এবং যে কোনও ডোমেন 5৮৩ টিএলডিগুলির মধ্যে একটি ব্যবহার করে যা 5 টির চেয়ে বেশি অক্ষরের, বা দুটি বা একাধিক হাইফেন রয়েছে তা অবৈধ হিসাবে চিহ্নিত হয়েছে। 0-65535 ব্যাপ্তির বাইরে পোর্ট নম্বর অনুমোদিত। এফটিপি এবং আইপি অ্যাড্রেসগুলি স্পষ্টতই অনুমোদিত নয় তবে লক্ষণীয়।
এটি কিছুটা পুরানো তবে এখানে আমি এটি কীভাবে করব। ইউআরএল পার্স করতে রুবির ইউআরআই মডিউলটি ব্যবহার করুন। যদি এটি বিশ্লেষণ করা যায় তবে এটি একটি বৈধ URL। (তবে এর অর্থ অ্যাক্সেসযোগ্য নয়))
ইউআরআই অনেকগুলি স্কিম সমর্থন করে, আপনি নিজেরাই কাস্টম স্কিমগুলি যুক্ত করতে পারেন:
irb> uri = URI.parse "http://hello.it" rescue nil
=> #<URI::HTTP:0x10755c50 URL:http://hello.it>
irb> uri.instance_values
=> {"fragment"=>nil,
"registry"=>nil,
"scheme"=>"http",
"query"=>nil,
"port"=>80,
"path"=>"",
"host"=>"hello.it",
"password"=>nil,
"user"=>nil,
"opaque"=>nil}
irb> uri = URI.parse "http:||bra.ziz" rescue nil
=> nil
irb> uri = URI.parse "ssh://hello.it:5888" rescue nil
=> #<URI::Generic:0x105fe938 URL:ssh://hello.it:5888>
[26] pry(main)> uri.instance_values
=> {"fragment"=>nil,
"registry"=>nil,
"scheme"=>"ssh",
"query"=>nil,
"port"=>5888,
"path"=>"",
"host"=>"hello.it",
"password"=>nil,
"user"=>nil,
"opaque"=>nil}
ইউআরআই মডিউল সম্পর্কে আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন ।
URI.parseরুবি 2.5.5 এ ব্যবহার করা আসলে এর কারণ ছিল - আপনি যদি কিছু বিজোড় ক্ষেত্রে পড়তে মন না মানেন তবে আমি নীচে @ জোনটসের উত্তরটিতে স্যুইচ করেছি। আমার উদ্দেশ্যগুলির জন্য আমি যত্ন নিই না যে এটি আদর্শ ছিল।
সাধারণভাবে,
/^#{URI::regexp}$/
ভাল কাজ করবে, তবে আপনি যদি কেবলমাত্র মেলে httpবা চান https, আপনি সেই পদ্ধতিতে বিকল্প হিসাবে পাস করতে পারেন:
/^#{URI::regexp(%w(http https))}$/
যদি আপনি প্রোটোকলগুলি প্রত্যাখ্যান করতে চান তবে এটি কিছুটা ভাল কাজ করতে ঝোঁক ftp://।
আপনি একটি রেইজেক্সও ব্যবহার করতে পারেন, হতে পারে http://www.geekzilla.co.uk/View2D3B0109-C1B2-4B4E-BFFD-E8088CBC85FD.htm এই রেজেক্সটি সঠিক বলে ধরে নিয়েছে (আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি) নীচের উইলগুলি ইউআরএলের বৈধতা প্রদর্শন করুন।
url_regex = Regexp.new("((https?|ftp|file):((//)|(\\\\))+[\w\d:\#@%/;$()~_?\+-=\\\\.&]*)")
urls = [
"http://hello.it",
"http:||bra.ziz"
]
urls.each { |url|
if url =~ url_regex then
puts "%s is valid" % url
else
puts "%s not valid" % url
end
}
উপরের উদাহরণ আউটপুট:
http://hello.it is valid
http:||bra.ziz not valid
URIকরতে হবে কারণ আসলে যা করা যায় তা আসলেই ভাঙা। উপরের অনেকগুলি আপত্তিকৃত উত্তরের নীচে মন্তব্যগুলি দেখুন। জ্যানির উত্তরটি সঠিক কিনা তা নিশ্চিত না তবে উত্সাহ দেওয়া আশা করি লোকেরা এটিকে আরও গুরুত্ব সহকারে বিবেচনা করবে। টিবিএইচ আমি শেষ করছি url.start_with?("http://") || url.start_with?("https://")কারণ আমার কেবল এইচটিটিপি প্রয়োজন এবং ব্যবহারকারীদের যথাযথ ইউআরএল ব্যবহার করার জন্য দায়বদ্ধ হওয়া উচিত।