URL मान्य करना एक मुश्किल काम है। यह एक बहुत व्यापक अनुरोध भी है।
तुम क्या करना चाहते हो, बिल्कुल? क्या आप URL के स्वरूप, अस्तित्व या क्या को मान्य करना चाहते हैं? कई संभावनाएं हैं, जो आप करना चाहते हैं उसके आधार पर।
एक नियमित अभिव्यक्ति URL के प्रारूप को मान्य कर सकती है। लेकिन यहां तक कि एक जटिल नियमित अभिव्यक्ति यह सुनिश्चित नहीं कर सकती है कि आप एक वैध URL के साथ काम कर रहे हैं।
उदाहरण के लिए, यदि आप एक सरल नियमित अभिव्यक्ति लेते हैं, तो यह संभवतः निम्नलिखित होस्ट को अस्वीकार कर देगा
http://invalid##host.com
लेकिन यह अनुमति देगा
http://invalid-host.foo
यदि आप मौजूदा TLD पर विचार करते हैं तो यह एक मान्य होस्ट है, लेकिन एक मान्य डोमेन नहीं है। वास्तव में, समाधान तब काम करेगा जब आप होस्टनाम को मान्य करना चाहते हैं, न कि डोमेन क्योंकि निम्नलिखित एक मान्य होस्टनाम है
http://host.foo
निम्नलिखित के रूप में अच्छी तरह से
http://localhost
अब, मैं आपको कुछ समाधान देता हूं।
यदि आप एक डोमेन को मान्य करना चाहते हैं, तो आपको नियमित अभिव्यक्ति के बारे में भूलने की आवश्यकता है। फिलहाल उपलब्ध सबसे अच्छा समाधान सार्वजनिक प्रत्यय सूची, मोज़िला द्वारा रखी गई सूची है। मैंने सार्वजनिक प्रत्यय सूची के खिलाफ डोमेन को पार्स और मान्य करने के लिए एक रूबी लाइब्रेरी बनाई, और इसे पब्लिकसफिक्स कहा जाता है ।
यदि आप URI / URL के प्रारूप को मान्य करना चाहते हैं, तो आप नियमित अभिव्यक्तियों का उपयोग करना चाह सकते हैं। एक की खोज करने के बजाय, अंतर्निहित रूबी URI.parse
विधि का उपयोग करें।
require 'uri'
def valid_url?(uri)
uri = URI.parse(uri) && !uri.host.nil?
rescue URI::InvalidURIError
false
end
आप इसे और अधिक प्रतिबंधक बनाने का निर्णय भी ले सकते हैं। उदाहरण के लिए, यदि आप चाहते हैं कि URL HTTP / HTTPS URL हो, तो आप सत्यापन को अधिक सटीक बना सकते हैं।
require 'uri'
def valid_url?(url)
uri = URI.parse(url)
uri.is_a?(URI::HTTP) && !uri.host.nil?
rescue URI::InvalidURIError
false
end
बेशक, इस पद्धति पर कई सुधार हो सकते हैं, जिसमें पथ या योजना की जाँच करना शामिल है।
अंतिम लेकिन कम से कम, आप इस कोड को एक सत्यापनकर्ता में भी पैकेज कर सकते हैं:
class HttpUrlValidator < ActiveModel::EachValidator
def self.compliant?(value)
uri = URI.parse(value)
uri.is_a?(URI::HTTP) && !uri.host.nil?
rescue URI::InvalidURIError
false
end
def validate_each(record, attribute, value)
unless value.present? && self.class.compliant?(value)
record.errors.add(attribute, "is not a valid HTTP URL")
end
end
end
# in the model
validates :example_attribute, http_url: true