यह जांचने का सबसे अच्छा तरीका है कि URL मान्य है या नहीं


149

मैं जाँच करने के लिए PHP का उपयोग करना चाहता हूं, अगर $myoutputचर में संग्रहीत स्ट्रिंग में एक वैध लिंक सिंटैक्स है या यह सिर्फ एक सामान्य पाठ है। फ़ंक्शन या समाधान, जिसे मैं खोज रहा हूं, उन्हें जीईटी मापदंडों वाले सभी लिंक प्रारूपों को पहचानना चाहिए।

एक समाधान, कई साइटों पर सुझाव दिया गया, वास्तव में स्ट्रिंग (CURL या file_get_contents()फ़ंक्शन का उपयोग करके ) मेरे मामले में संभव नहीं है और मैं इससे बचना चाहूंगा।

मैंने नियमित अभिव्यक्ति या किसी अन्य समाधान के बारे में सोचा।


CURL का उपयोग करना या इसे प्राप्त करना HTTP कंटेंट धीमा हो सकता है, यदि आप कुछ अधिक तेज़ और लगभग विश्वसनीय चाहते हैं, तो होस्टनाम पर gethostbyaddr () का उपयोग करने पर विचार करें। यदि यह एक आईपी को हल करता है, तो संभवतः इसकी एक वेबसाइट है। बेशक यह आपकी आवश्यकताओं पर निर्भर करता है।
ट्रेविसो

जवाबों:


301

आप एक देशी फ़िल्टर Validator का उपयोग कर सकते हैं

filter_var($url, FILTER_VALIDATE_URL);

URL के रूप में मान (» http://www.faqs.org/rfcs/rfc2396 के अनुसार ), वैकल्पिक रूप से आवश्यक घटकों के साथ। मान्य URL से सावधान रहना HTTP प्रोटोकॉल को निर्दिष्ट नहीं कर सकता है http: // तो आगे की मान्यता के लिए यह निर्धारित करना आवश्यक है कि URL अपेक्षित प्रोटोकॉल का उपयोग करता है, जैसे ssh: // या mailto:। ध्यान दें कि फ़ंक्शन केवल ASCII URL को मान्य होगा; अंतर्राष्ट्रीय डोमेन नाम (गैर- ASCII वर्ण युक्त) विफल हो जाएंगे।

उदाहरण:

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
    die('Not a valid URL');
}

9
@Raveren अपेक्षित व्यवहार के बाद से ये मान्य URL हैं।
गॉर्डन

8
ध्यान रखें कि FILTER_VALIDATE_URLएक यूआरएल के प्रोटोकॉल को मान्य नहीं किया जाएगा। तो ssh://, ftp://आदि पास हो जाएगा।
Seph

3
@ SephVelut अपेक्षित व्यवहार है क्योंकि ये मान्य URL हैं।
गॉर्डन

1
यह ttp जैसे यूआरएल की अनुमति देता है: //amazon.com
Elia Weiss

4
@ जोशदास, मुझे लगता है कि आप इस बिंदु को याद कर रहे हैं। PHP कोड वही करता है जो वह करने का दावा करता है। लेकिन यह आपके दिमाग को नहीं पढ़ सकता। अमान्य और अवांछित के बीच बहुत बड़ा अंतर है .. अवांछित बहुत व्यक्तिपरक है, यही वजह है कि प्रोग्रामर को उस विवरण को निकालने के लिए छोड़ दिया गया है। आप यह भी नोट कर सकते हैं कि कोड URL को मान्य करता है, लेकिन यह साबित नहीं होता है कि यह मौजूद है। यह PHP की गलती नहीं है कि एक उपयोगकर्ता ने "amazon," "amozon," को गलत माना, जो कि मान्य होगा, लेकिन अभी भी अवांछित है।
JBH

20

यहाँ पर मुझे सबसे अच्छा ट्यूटोरियल मिला है:

http://www.w3schools.com/php/filter_validate_url.asp

<?php
$url = "http://www.qbaki.com";

// Remove all illegal characters from a url
$url = filter_var($url, FILTER_SANITIZE_URL);

// Validate url
if (filter_var($url, FILTER_VALIDATE_URL) !== false) {
echo("$url is a valid URL");
} else {
echo("$url is not a valid URL");
}
?>

संभव झंडे:

FILTER_FLAG_SCHEME_REQUIRED - URL must be RFC compliant (like http://example)
FILTER_FLAG_HOST_REQUIRED - URL must include host name (like http://www.example.com)
FILTER_FLAG_PATH_REQUIRED - URL must have a path after the domain name (like www.example.com/example1/)
FILTER_FLAG_QUERY_REQUIRED - URL must have a query string (like "example.php?name=Peter&age=37")

1
बस एक नट: !filter_var(...) === false==> filter_var(...) === trueया बस filter_var(...)। :)
डोमिनिको फेलिस

@ ErichGarcía इस कोड की जाँच नहीं करता है कि यह एक मान्य HTTP / S URL है जैसे ओपी पूछता है। यह ssh: //, ftp: // इत्यादि चीजों को पास करेगा, अगर यह RFC 2396 के अनुसार इसका सिंटैक्टिकली वैध URL है तो इसकी जाँच करता है
twigg

FILTER_VALIDATE_URL का उपयोग न करें। यह गन्दा और अविश्वसनीय है। उदा। यह मान्य ttps://www.youtube.comहै
जेफेज़

12

फ़िल्टर_वर () गैर-एससीआई चार्ट के साथ यूआरएल के लिए विफल हो जाएगा, उदाहरण के लिए ( http://pt.wikipedia.org/wiki/Guimarães )। निम्न फ़ंक्शन फ़िल्टर_वर () को कॉल करने से पहले सभी गैर- अस्की चर ( जैसे http://pt.wikipedia.org/wiki/Guimar%C3%A3es ) को एनकोड करता है।

आशा है कि यह किसी की मदद करता है।

<?php

function validate_url($url) {
    $path = parse_url($url, PHP_URL_PATH);
    $encoded_path = array_map('urlencode', explode('/', $path));
    $url = str_replace($path, implode('/', $encoded_path), $url);

    return filter_var($url, FILTER_VALIDATE_URL) ? true : false;
}

// example
if(!validate_url("http://somedomain.com/some/path/file1.jpg")) {
    echo "NOT A URL";
}
else {
    echo "IS A URL";
}

यह बात है। अंत में 2017 में कोई वापस आया
काइल किम

मेरे लिए काम करता है (अन्य लोग बीटीडब्ल्यू नहीं करते हैं) :)
जोनो

यह केवल समाधान है कि मेरे लिए काम किया है। धन्यवाद!
सिलास

10
function is_url($uri){
    if(preg_match( '/^(http|https):\\/\\/[a-z0-9_]+([\\-\\.]{1}[a-z_0-9]+)*\\.[_a-z]{2,5}'.'((:[0-9]{1,5})?\\/.*)?$/i' ,$uri)){
      return $uri;
    }
    else{
        return false;
    }
}

3

व्यक्तिगत रूप से मैं यहां नियमित अभिव्यक्ति का उपयोग करना चाहूंगा। Bellow code ने मेरे लिए पूरी तरह से काम किया।

$baseUrl     = url('/'); // for my case https://www.xrepeater.com
$posted_url  = "home";
// Test with one by one
/*$posted_url  = "/home";
$posted_url  = "xrepeater.com";
$posted_url  = "www.xrepeater.com";
$posted_url  = "http://www.xrepeater.com";
$posted_url  = "https://www.xrepeater.com";
$posted_url  = "https://xrepeater.com/services";
$posted_url  = "xrepeater.dev/home/test";
$posted_url  = "home/test";*/

$regularExpression  = "((https?|ftp)\:\/\/)?"; // SCHEME Check
$regularExpression .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass Check
$regularExpression .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP Check
$regularExpression .= "(\:[0-9]{2,5})?"; // Port Check
$regularExpression .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path Check
$regularExpression .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query String Check
$regularExpression .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor Check

if(preg_match("/^$regularExpression$/i", $posted_url)) { 
    if(preg_match("@^http|https://@i",$posted_url)) {
        $final_url = preg_replace("@(http://)+@i",'http://',$posted_url);
        // return "*** - ***Match : ".$final_url;
    }
    else { 
          $final_url = 'http://'.$posted_url;
          // return "*** / ***Match : ".$final_url;
         }
    }
else {
     if (substr($posted_url, 0, 1) === '/') { 
         // return "*** / ***Not Match :".$final_url."<br>".$baseUrl.$posted_url;
         $final_url = $baseUrl.$posted_url;
     }
     else { 
         // return "*** - ***Not Match :".$posted_url."<br>".$baseUrl."/".$posted_url;
         $final_url = $baseUrl."/".$final_url; }
}

1
वेबसाइट URL को मान्य करने के लिए यह सबसे अच्छा उत्तर है। थोड़े बदलाव के साथ यह काम पूरी तरह से हो गया। धन्यवाद
अमीर हुसैन करिमी

3

फ़िल्टर_वर () http: // की आवश्यकता वाले मुद्दों को देखते हुए, मैं उपयोग करता हूं:

$is_url = filter_var($filename, FILTER_VALIDATE_URL) || array_key_exists('scheme', parse_url($filename));


FILTER_VALIDATE_URL का उपयोग न करें। यह गन्दा और अविश्वसनीय है। उदा। यह मान्य ttps://www.youtube.comहै
जेफज़

2

आप इस फ़ंक्शन का उपयोग कर सकते हैं, लेकिन यदि वेबसाइट ऑफ़लाइन है तो यह गलत हो जाएगी।

  function isValidUrl($url) {
    $url = parse_url($url);
    if (!isset($url["host"])) return false;
    return !(gethostbyname($url["host"]) == $url["host"]);
}

2

वास्तव में ... फ़िल्टर_वर ($ url, FILTER_VALIDATE_URL); बहुत अच्छी तरह से काम नहीं करता है। जब आप वास्तविक url में टाइप करते हैं, तो यह काम करता है, लेकिन यह केवल http: // के लिए जाँच करता है, इसलिए यदि आप " http: // weirtgcyaurbatc " जैसी कोई चीज़ टाइप करते हैं , तो भी यह वास्तविक है।


उदाहरण के लिए FILTER_VALIDATE_URL मान्य के ttps://www.youtube.comरूप में मान्य है
जेफज़

1

यह जांचने का एक और तरीका है कि दिया गया URL वैध है या नहीं, इसे एक्सेस करने का प्रयास करें, नीचे दिए गए फ़ंक्शन से हेडर दिए गए URL से प्राप्त होंगे, यह सुनिश्चित करेगा कि URL वैध है और वेब सर्वर जीवित है:

function is_url($url){
        $response = array();
        //Check if URL is empty
        if(!empty($url)) {
            $response = get_headers($url);
        }
        return (bool)in_array("HTTP/1.1 200 OK", $response, true);
/*Array
(
    [0] => HTTP/1.1 200 OK 
    [Date] => Sat, 29 May 2004 12:28:14 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    [ETag] => "3f80f-1b6-3e1cb03b"
    [Accept-Ranges] => bytes
    [Content-Length] => 438
    [Connection] => close
    [Content-Type] => text/html
)*/ 
    }   

अछा सुझाव। यह विफल हो जाएगा यदि सर्वर HTTP / 1.0 या HTTP / 2.0 का उपयोग कर रहा है, या एक रीडायरेक्ट देता है।
--मईमेफ़िश

हां, यह एक शुरुआती बिंदु है, आगे सुधार आसानी से किया जा सकता है।
बड दमनोव

1

2012 से इस लेख के पार आ गया। यह खाता चर में ले जाता है जो हो सकता है या नहीं उन केवल सादे URL हो हैं।

लेख के लेखक, डेविड मुलर , इस फ़ंक्शन को यह कहते हैं कि वे कहते हैं, "... मूल्य के लायक हो सकता है [sic]," filter_varऔर इसके कमियों के कुछ उदाहरणों के साथ ।

/**
 * Modified version of `filter_var`.
 *
 * @param  mixed $url Could be a URL or possibly much more.
 * @return bool
 */
function validate_url( $url ) {
    $url = trim( $url );

    return (
        ( strpos( $url, 'http://' ) === 0 || strpos( $url, 'https://' ) === 0 ) &&
        filter_var(
            $url,
            FILTER_VALIDATE_URL,
            FILTER_FLAG_SCHEME_REQUIRED || FILTER_FLAG_HOST_REQUIRED
        ) !== false
    );
}

0

अगर किसी को सत्यापन के लिए CURL का उपयोग करने में रुचि है। आप निम्न कोड का उपयोग कर सकते हैं।

<?php 
public function validationUrl($Url){
        if ($Url == NULL){
            return $false;
        }
        $ch = curl_init($Url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return ($httpcode >= 200 && $httpcode < 300) ? true : false; 
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.