kostenloser Webspace werbefrei: lima-city


validate URL ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    oindex

    oindex hat kostenlosen Webspace.

    Hallo

    anscheinend funktioniert filter_var($url, FILTER_VALIDATE_URL) nicht wirklich,

    $url = 'hddb://google.de'; 
    $checkurl = filter_var($url, FILTER_VALIDATE_URL); 
    var_dump($checkurl);


    die Ausgabe ist:

    string(16) "hddb://google.de"


    also würde die Adrese als Valide durchgehen, was ja Quatsch ist ... hddb://

    erwartet hätte ich als Ausgabe

    bool(false)



    alternativ ginge ja auch preg_match mit einem Regex für URLs
    aber da finde ich verschiedene Beispiele,

    welches regex für URL validate zur Prüfung mit preg_match() würdet Ihr mir empfehlen?
    oder besser gleich prüfen, ob URL erreichbar ist ... header-Status oder andere Methode?

    ---> Wie am besten prüfen, ob URL valide (und erreichbar) ist ?

    Danke

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. vielleicht so:

    function isValidURL($url)
    {
    return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url);
    }



    nicht getestet!
  4. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    oindex schrieb:
    Hallo

    anscheinend funktioniert filter_var($url, FILTER_VALIDATE_URL) nicht wirklich,

    $url = 'hddb://google.de'; 
    $checkurl = filter_var($url, FILTER_VALIDATE_URL); 
    var_dump($checkurl);


    die Ausgabe ist:

    string(16) "hddb://google.de"


    also würde die Adrese als Valide durchgehen, was ja Quatsch ist ... hddb://

    erwartet hätte ich als Ausgabe

    bool(false)
    Du hast anscheinend nicht verstanden URLs funktionieren...
    hddb ist einfach ein Protokoll... ob es das gibt oder nicht ist hier egal, wichtig ist nur, dass es sich um eine valide URL handelt, was ja der Fall ist.

    Du möchtest also anscheinend nur wissen, ob es eine http://irgendwas-URL ist...
    Das Regex dazu:
    |^http://(.*)$|
  5. w*****e

    du kannst dann ja mit file_get_contents() prüfen ob die datei existiert, da nur im erfolgsfall wirklich ein String entsteht und sonst ein FALSE
  6. g****e

    filter_var ist da sehr weitläuft. Das lässt auch test@test als valide Mailadresse zu. Oben wurde erklärt warum ;-)

    Du könntest auch nur fragen, ob die URL Existiert:
    function url_exists($url) { 
        $f=@fopen( $url , 'r' ); 
        if( $f ) { 
            fclose( $f ); 
            return true; 
        }
        return false; 
    }


    Jenachdem was diese Funktion zurückgibt, existiert die URL oder nicht. Wird denk ich ersichtlich :)

    Liebe Grüße
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ggamee schrieb:
    Du könntest auch nur fragen, ob die URL Existiert:
    function url_exists($url) { 
        $f=@fopen( $url , 'r' ); 
        if( $f ) { 
            fclose( $f ); 
            return true; 
        }
        return false; 
    }


    Jenachdem was diese Funktion zurückgibt, existiert die URL oder nicht. Wird denk ich ersichtlich :)
    Was nicht unbedingt die beste Variante ist, da es in PHP auch ein paar Protokolle gibt, die hier nicht wirklich gefragt sind:
    ftps, compress.zlib, php, file, glob, data, ftp, phar
    Damit könnte der Zugriff auch auf lokale Dateien möglich sein...

    Verwend einfach folgenden Code:
    function validateURL($url) {
    
    	if(filter_var($url, FILTER_VALIDATE_URL) === false)
    		return(false);
    
    	preg_match_all('|^(.*?)://.*|', $url, $matches);
    	if($matches[1][0] != 'http')
    		return(false);
    
    	$curl = curl_init($url);
    
    	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    
    	$data = curl_exec($curl);
    
    	$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    
    	curl_close($curl);
    	return($status == 200);
    }


    Beitrag zuletzt geändert: 29.4.2012 16:02:49 von hackyourlife
  8. Autor dieses Themas

    oindex

    oindex hat kostenlosen Webspace.

    Danke

    ich habe halt angenommen, dass:
    filter_var($url, FILTER_VALIDATE_URL);

    auch erkennt, ob es sich um ein "gängiges" Protokoll handelt, also http:// https:// oder ftp://
    aber da wird ja anscheinend "nur" die Syntax geprüft.

    daher nehme ich wohl doch lieber ein regex
    das von flashzeugs vorgeschlagene habe ich auch irgendwo gefunden,
    aber eben auch noch 10 andere, und bevor ich die alle stundenlang ausprobiere,
    halt (nochmal) die Frage: .... welches als "gut" bekannt ist, ... getestete Empfehlung(en) ?

    das file_get_contents() bzw. die function url_exists($url) { ... } ist auch bestimmt sehr hilfreich

    schön wäre halt, wenn ein Status zurück-gegeben wird, also ob 200, 404 oder 301 , etc.
    denn eine Webseite mit Fehler kann ja quasi auch immer erreichbar sein, halt als Fehlerseite

    aber mit
    get_headers($url, 1);

    bekomme ich bei 404 Fehlerseiten die weitergeleitet werden
    den Status 301 ... weil es wohl als Fehlerseite in .htaccess Rewrite steht

    BSP:

    get_headers('http://www.test.de/blubb/lala.php', 1);

    [0] => HTTP/1.1 301 Moved Permanently

    kann man das anders Abfragen, damit man in dem Fall doch den Status 404 bekommt ?

  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    oindex schrieb:
    Danke

    ich habe halt angenommen, dass:
    filter_var($url, FILTER_VALIDATE_URL);

    auch erkennt, ob es sich um ein "gängiges" Protokoll handelt, also http:// https:// oder ftp://
    aber da wird ja anscheinend "nur" die Syntax geprüft.

    daher nehme ich wohl doch lieber ein regex
    das von flashzeugs vorgeschlagene habe ich auch irgendwo gefunden,
    aber eben auch noch 10 andere, und bevor ich die alle stundenlang ausprobiere,
    halt (nochmal) die Frage: .... welches als "gut" bekannt ist, ... getestete Empfehlung(en) ?

    das file_get_contents() bzw. die function url_exists($url) { ... } ist auch bestimmt sehr hilfreich

    schön wäre halt, wenn ein Status zurück-gegeben wird, also ob 200, 404 oder 301 , etc.
    denn eine Webseite mit Fehler kann ja quasi auch immer erreichbar sein, halt als Fehlerseite
    Schau dir nochmal den leicht veränderten Code an:
    <?php
    
    function validateURL($url) {
    
    	if(filter_var($url, FILTER_VALIDATE_URL) === false)
    		return(false);
    
    	preg_match_all('|^(.*?)://.*|', $url, $matches);
    	if($matches[1][0] != 'http') // only http is allowed
    		return(false);
    
    	$curl = curl_init($url);
    
    	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    
    	$data = curl_exec($curl);
    
    	$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    
    	curl_close($curl);
    	return($status != 0); // 0 = keine Serverantwort
    }
    
    header('Content-Type: text/plain');
    echo('ftp: ');
    var_dump(validateURL('ftp://localhost'));
    echo('http: ');
    var_dump(validateURL('http://www.google.com/'));
    echo('http nonexistent: ');
    var_dump(validateURL('http://nirvana/'));
    
    
    ?>
    Der Code prüft jetzt ganz einfach ob die URL eine http://irgendwas-URL ist und ob ein Server darauf reagiert.
    Wenn die URL valid ist: true; sonst false
    Schau dir die Beispielaufrufe an, um das selbst zu bestaunen.

    Und getestet ist das Script; es funktioniert auch perfekt ;-)
  10. Autor dieses Themas

    oindex

    oindex hat kostenlosen Webspace.

    hackyourlife schrieb:
    Und getestet ist das Script; es funktioniert auch perfekt ;-)


    Danke,
    aber bei Test auf lima-city.de Webspace bekomme ich als Fehlermeldung (Warning)

    Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/webpages/lima-city/oindex/html/urlcheck2.php on line 32


    habe dann noch bischen zu curl gesucht,
    und gefunden, das im HEADER auch die 'redirect_url' steht

    function getHttpCode( $url ) {
        $ch = curl_init();
    
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
        curl_exec($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);
    
        return $info;
    ##  return array( $info['http_code'], $info['redirect_url'] );
    
    }



    Aufruf

    $urls_list = array(
      'http://google.de', 
      'http://www.google.de',
      'google.de', 
      'www.google.de', 
      'hddb://google.de', 
      'http://test.de/blubb/lala.php?x=aaa', 
      'http://www.test.de/blubb/lala.php?x=aaa', 
      'oindex.lima-city.de',  
      'http://oindex.lima-city.de', 
      'ftp://localhost', 
      'http://www.google.com/', 
      'http://nirvana/'
    ); 
    
    
    foreach($urls_list as $url) { 
    
    $hinfo = getHttpCode($url); 
    
    echo "<br />URL: ".$url."\n"; 
    echo "<br />Status: ".$hinfo['http_code']."\n"; 
    echo "<br />Redirect: ".$hinfo['redirect_url']."\n"; 
    echo "<br />\n"; 
    
    ## echo "<pre>\n"; 
    ## print_r($hinfo);
    ## echo "</pre>\n"; 
    
    }

    aber dabei bleibt das Problem bei Weiterleitung (auf 404 Fehlerseite)

    die URL: http://test.de/blubb/lala.php hat Status 301 und wird
    weitergeleitet zu: http://www.test.de/blubb/lala.php?x=aaa ... also mit www.
    prüfe ich direkt http://www.test.de/blubb/lala.php?x=aaa ... bekomme ich Status 404

    die URL: http://google.de hat Status 302 und wird
    weitergeleitet zu: http://www.google.de ... also mit www.
    prüfe ich direkt http://www.google.de ... bekomme ich Status 200

    also muss ich jedesmal wenn 'redirect_url' vorhanden ist
    nochmal die 'redirect_url' prüfen, um den Status der Ziel-Adresse zu bekommen


    ... 
    echo "<br />URL: ".$url."\n"; 
    echo "<br />Status: ".$hinfo['http_code']."\n"; 
    
    if (!empty($hinfo['redirect_url'])) { 
    echo "<br />Redirect: ".$hinfo['redirect_url']."\n"; 
    
    $hinfo2 = getHttpCode($hinfo['redirect_url']); 
    echo "<br />Redirect Status: ".$hinfo2['http_code']."\n"; 
    }
    
    echo "<br />\n"; 
    ...



    Weil eine Weiterleitung heisst ja noch nicht OK,
    es kann ja eine Weiterleitung zu einer Fehlerseite sein ....

    und für den Fall, das eine Weiterleitung wieder eine Weiterleitung ist
    bräuchte ich da wohl eine while() Schleife,
    ... auch um z.B. ab 3x redirect die URL zu blocken, oder wieviele sind noch OK?


    PS:
    komisch, das ein "normaler" .htaccess Rewrite wie index.php?name=horst als horst.html anzeigen
    gleich Status 200 hat und keine Info zum Rewrite, so wie bei mit www. Rewrite bei test.de ?!
    ... naja, keine Ahnung wie bei test.de der Rewrite gelöst ist, htaccess oder header(Location) in PHP
  11. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    oindex schrieb:
    hackyourlife schrieb:
    Und getestet ist das Script; es funktioniert auch perfekt ;-)


    Danke,
    aber bei Test auf lima-city.de Webspace bekomme ich als Fehlermeldung (Warning)

    Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/webpages/lima-city/oindex/html/urlcheck2.php on line 32
    Hab wohl vergessen dass auf lima-city einiges anders funktioniert und das Script nur lokal getestet ;-)

    Veränder doch die Funkton so:
    function validateURL($url) {
    
    	if(filter_var($url, FILTER_VALIDATE_URL) === false)
    		return(false);
    
    	preg_match_all('|^(.*?)://.*|', $url, $matches);
    	if($matches[1][0] != 'http') // only http is allowed
    		return(false);
    
    	$curl = curl_init($url);
    
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    
    	$data = curl_exec($curl);
    
    	$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    
    	curl_close($curl);
    	return($status != 0); // 0 = keine Serverantwort
    }
    Die Zeile mit CURLOPT_FOLLOWLOCATION einfach entfernt...
    So bekommst du direkt die Statuscodes, was dein Problem beheben könnte...
    Wenn du also eine Weiterleitungsseite aufrufst bekommst du auch den Weiterleitungscode, egal wohin weitergeleitet wird...

    Wenn das nicht das ist was du wolltest erklär bitte nochmal was bei den Weiterleitungen wie passieren sollte...
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!