কোনও URL টি কার্যকর কিনা তা পরীক্ষা করে দেখুন


94

স্ট্রিংটি বৈধ ইউআরএল কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

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

http://hello.it => yes
http:||bra.ziz, => no

এটি যদি কোনও বৈধ ইউআরএল হয় তবে আমি কীভাবে এটি পরীক্ষা করতে পারি যে এটি কোনও চিত্রের ফাইলের সাথে সম্পর্কিত কিনা?


আপনার প্রদত্ত ইউআরএলটি একটি নিখুঁত url বলে মনে হচ্ছে, কোনও চিত্র ফাইলের সাথে আপনার কী বোঝাতে
চাইছে

আমি চশমা যুক্ত একটি ইউরিভালিডেটর পোস্ট করেছি ।
জেজেডি

উত্তর:


178

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/

25
এটি কাজ করে না বলে মনে হচ্ছে: 'http://:5984/asdf' =~ URI::regexpএবং 'http::5984/asdf' =~ URI::regexpউভয়ই ফিরে আসবে I
আট

4
লোকালহোস্টে 5984 পোর্ট 5984 নয়?
এমএক্সসিএল

4
এটি কোনও ভেরিয়েবেলে একটি বৈধ url রয়েছে কিনা তা এটি যাচাই করে। এটি একটি বৈধ URL হিসাবে " উদাহরণস্বরূপ com" গ্রহণ করবে । কারণ এতে একটি রয়েছে। তবে আপনি যদি পুরো জিনিসটি ইউআরএল হওয়ার আশা করেন তবে এটি সহায়ক নয়।
আলেকজান্ডার গেথার

4
গেডকএন: যদিও এটি আরএফসি 1738 অনুসারে কোনও বৈধ URL নয়।
মিকায়েল এস

12
এটি ব্যবহার করবেন না, এটি এতটাই খারাপ যে "http:"এই রেজিপ্সকে পাস করে।
স্মার্ট

43

উপরের উত্তরের অনুরূপ, আমি এই রেজেক্সটি কিছুটা আরও নির্ভুল হিসাবে ব্যবহার করতে দেখছি:

URI::DEFAULT_PARSER.regexp[:ABS_URI]

এটি URI.regexpকোনও কারণে ফাঁকা স্থানগুলিকে অনুমতি দেয় এর বিপরীতে স্পেস সহ ইউআরএলকে অকার্যকর করবে ।

আমি সম্প্রতি একটি শর্টকাট পেয়েছি যা বিভিন্ন ইউআরআই আরজিএক্সপিএসের জন্য সরবরাহ করা হয়। আপনি যে কোনও থেকে URI::DEFAULT_PARSER.regexp.keysসরাসরি অ্যাক্সেস করতে পারেন URI::#{key}

উদাহরণস্বরূপ, :ABS_URIregexp থেকে অ্যাক্সেস করা যেতে পারে URI::ABS_URI


4
আপনি যদি কোনও সময়ে ইউআরআই.পার্স ব্যবহার করার পরিকল্পনা করেন তবে অবশ্যই এটি যাওয়ার উপায়। ইউআরআই :: রিজেক্সএফ নির্দিষ্ট URL গুলির সাথে মেলে যা পরে ইউআরআই পার্স ব্যবহার করার পরে ব্যর্থ হবে। টিপ জন্য ধন্যবাদ.
মার্ককেজাদা

দুঃখের বিষয়, এটি কেবল রুবি ১.৯-এ উপলব্ধ, ১.৮ নয়।
স্টিভ ম্যাডসেন

4
কিন্তু এ কাজ করে: /^#{URI.regexp}$/। ঝামেলা হ'ল URI.regexpনোঙ্গর করে না। কোনও স্থানের সাথে একটি স্ট্রিং ইউআরআইয়ের অংশ হিসাবে স্থানটিকে বৈধতা দিচ্ছে না, তবে সমস্ত কিছু স্থান পর্যন্ত নিয়ে যাচ্ছে। যদি সেই খণ্ডটি বৈধ ইউআরআইয়ের মতো দেখায়, ম্যাচটি সফল হয়।
স্টিভ ম্যাডসেন

4
আপনার প্রস্তাবগুলিতে অ্যান্ডেন্ডের মন্তব্য প্রয়োগ করা: '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 দেয় পাশাপাশি। উপরের কোনটিই রেগেক্সপস পুরোপুরি সঠিক নয়, তবে তারা কেবল খুব বিজোড় পরিস্থিতিতে ব্যর্থ হয় এবং বেশিরভাগ ক্ষেত্রে এটি কোনও বড় বিষয় নয়।
স্কলে

4
অবগতির জন্য, URI::DEFAULT_PARSER.regexp[:ABS_URI]অভিন্ন হয়/\A\s*#{URI::regexp}\s*\z/
Aidan

36

বর্তমান উত্তরগুলির সাথে সমস্যাটি হ'ল কোনও ইউআরআই কোনও 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

@ ফিলিপ উভয় সহায়ক এবং উপযুক্ত ছিল। আপনাকে অনেক ধন্যবাদ!
fotanus

4
uri.kind_of?(URI::HTTP)কমপক্ষে রুবি ১.৯.৩ এ উভয় ক্ষেত্রেই (HTTP এবং https) পর্যাপ্ত বলে মনে হচ্ছে।
Andrea Salicetti

জোকস এর উত্তরে @ এসকলি দ্বারা বর্ণিত সমস্যাগুলি এখনও ভোগ করছে
আকস্তাদদিনভ

4
সংক্ষিপ্তসার, 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?
শেন

19

আমি ঠিকানাযোগ্য রত্নটিকে পছন্দ করি । আমি খুঁজে পেয়েছি যে এটি 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

4
আমি কেবল ঠিকানাযোগ্য :: ইউআর.আইপি পার্সকে () অদ্ভুত স্ট্রিং দিয়ে খাওয়ার ফলে এটি কী প্রত্যাখ্যান করে। এটি ক্রেজি স্টাফ গ্রহণ করেছে। তবে এটি প্রথম স্ট্রিংটি গ্রহণ করে নি "" :-) "। হুঁ।
এমভিডব্লিউ

4
এটি কীভাবে এতগুলি উপার্জন পাবে? Addressable::URI.parseঅবৈধ ইনপুট দিয়ে শূন্য করে না।
আবর্জনাবিহীন

11

এটি মোটামুটি পুরানো এন্ট্রি, তবে আমি ভেবেছিলাম যে আমি এগিয়ে গিয়ে অবদান রাখব:

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

4
এটি উপরের সমাধানগুলির চেয়ে অনেক ভাল কাজ করে । এটিতে উপরে বর্ণিত ক্যাভ্যাটগুলি নেই, এবং জাভাস্ক্রিপ্টের মতো ইউরিস গ্রহণ করে না: সতর্কতা ('স্প্যাম')।
bchurchill

4
তবে এটিও মেলে http:/যা আপনি যা চান তা নাও হতে পারে।
বো জিনেস 22

11

আমার জন্য, আমি এই নিয়মিত প্রকাশটি ব্যবহার করি:

/^(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 ব্যাপ্তির বাইরে পোর্ট নম্বর অনুমোদিত। এফটিপি এবং আইপি অ্যাড্রেসগুলি স্পষ্টতই অনুমোদিত নয় তবে লক্ষণীয়।
এডান

4
দ্রুত ইউআরএল পরীক্ষার জন্য খুব সহজেই এখানে সর্বাধিক প্রযোজ্য সমাধান। ধন্যবাদ
কোনও দিকনির্দেশনা

4

এটি কিছুটা পুরানো তবে এখানে আমি এটি কীভাবে করব। ইউআরএল পার্স করতে রুবির ইউআরআই মডিউলটি ব্যবহার করুন। যদি এটি বিশ্লেষণ করা যায় তবে এটি একটি বৈধ 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 এ ব্যবহার করা আসলে এর কারণ ছিল - আপনি যদি কিছু বিজোড় ক্ষেত্রে পড়তে মন না মানেন তবে আমি নীচে @ জোনটসের উত্তরটিতে স্যুইচ করেছি। আমার উদ্দেশ্যগুলির জন্য আমি যত্ন নিই না যে এটি আদর্শ ছিল।
el n00b

3

সাধারণভাবে,

/^#{URI::regexp}$/

ভাল কাজ করবে, তবে আপনি যদি কেবলমাত্র মেলে httpবা চান https, আপনি সেই পদ্ধতিতে বিকল্প হিসাবে পাস করতে পারেন:

/^#{URI::regexp(%w(http https))}$/

যদি আপনি প্রোটোকলগুলি প্রত্যাখ্যান করতে চান তবে এটি কিছুটা ভাল কাজ করতে ঝোঁক ftp://


-2

আপনি একটি রেইজেক্সও ব্যবহার করতে পারেন, হতে পারে 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

4
মেলটো স্কিমের কী হবে? অথবা টেলনেট, গোফার, এনএনটিপি, আরএসএনসি, এসএসএস, বা অন্য কোনও প্রকল্প? ইউআরএলগুলি কেবল এইচটিটিপি এবং এফটিপি-র চেয়ে কিছুটা জটিল।
মিউ খুব ছোট

ইউআরএলগুলিকে বৈধতা দেওয়ার জন্য রেজেক্স লেখা কঠিন। কেন বিরক্ত হও?
রিমিয়ান

@ রিমিয়ান, আপনাকে বিরক্ত URIকরতে হবে কারণ আসলে যা করা যায় তা আসলেই ভাঙা। উপরের অনেকগুলি আপত্তিকৃত উত্তরের নীচে মন্তব্যগুলি দেখুন। জ্যানির উত্তরটি সঠিক কিনা তা নিশ্চিত না তবে উত্সাহ দেওয়া আশা করি লোকেরা এটিকে আরও গুরুত্ব সহকারে বিবেচনা করবে। টিবিএইচ আমি শেষ করছি url.start_with?("http://") || url.start_with?("https://")কারণ আমার কেবল এইচটিটিপি প্রয়োজন এবং ব্যবহারকারীদের যথাযথ ইউআরএল ব্যবহার করার জন্য দায়বদ্ধ হওয়া উচিত।
akostadinov
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.