Andi: URL richtig testen

Ich würde gerne eine URL so testen, das sie nach dem Vorgang auch noch den gleichen Anfang hat. Also aus

www.example.com

oder

example.com

soll immer

http://www.example.com

werden.

Jetzt habe ich mit der Filter funktion von PHP FILTER_VALIDATE_URL die URL getestet. Aber hier geht sie nur durch wenn Sie die Vorzeichen

http://www.

vorne hat.

Mit www. oder ganz ohne geht sie nicht durch.

Wie kann ich es bewerkstelligen, das ein Test anschliessend auch noch eine saubere URL bringt.

Andy


$url = "http://www.example.com"; 
$test = filter_var($url, FILTER_VALIDATE_URL);
if ($test === false) 
{ 

    echo "no"; 
} 
else 
{ 

    echo "ok"; 

}
  1. Ich würde gerne eine URL so testen, das sie nach dem Vorgang auch noch den gleichen Anfang hat. Also aus www.example.com oder example.com soll immer http://www.example.com werden.

    Wenn aus example.com http://www.example.com wird, hat sie nicht mehr den gleichen Anfang. Du scheinst dir zu widersprechen.

    Jetzt habe ich mit der Filterfunktion von PHP FILTER_VALIDATE_URL die URL getestet. Aber hier geht sie nur durch wenn Sie die Vorzeichen http://www. vorne hat.

    Mit www. oder ganz ohne geht sie nicht durch.

    Ich vermute eher, sie geht nicht durch, weil die Protokollangabe fehlt. Klemme http:// davor, falls es fehlt.

  2. Hallo,

    PHP hat zig String-Funktionen, da wirst du doch eine passende finden können!

    Gruß
    Kalk

    1. Ich durchlaufe einfach zweimal ein preg_match, und wenn http fehlt, schreibe ich es in den String vorher dazu. Ich denke die Lösung funktioniert. Vieleicht sollte man anschliessend zur sicherheit nochmals mit

      filter_var($string, FILTER_VALIDATE_URL);
      

      testen

      $string = 'example.com';
      
      if (preg_match('/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $string))	
      	{
      	echo'ok';
      	}
      elseif (preg_match('/^([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $string))	
      	{
      	$string ='http://'.$string;
      	echo'ok';
      	}
      else
      	{
      	echo'NO';
      	}	
      
      
      1. Ich durchlaufe einfach zweimal ein preg_match, und wenn http fehlt, schreibe ich es in den String vorher dazu. Ich denke die Lösung funktioniert. Vielleicht sollte man anschliessend zur sicherheit nochmals mit filter_var($string, FILTER_VALIDATE_URL);

        So, wie deine preg_match-Geschichte aussieht, solltest du besser nur mit filter_var prüfen.

        Sonderlich sinnvoll (oder besser: vertrauenserweckend in deine Programmierkünste?) ist es zudem nicht, einen vergleichweise großen Block zur URL-Prüfung selber zu basteln und dann noch eine (bessere) Prüffunktion hinterherzuschubsen. Dann kannst du auch gleich letztere aufrufen und dort bei Fehler den http-Teil vorklemmen.

        if (preg_match('/^(http|https)://([A-Z0-9][A-Z0-9_-](?:.[A-Z0-9][A-Z0-9_-])+):?(\d+)?/?/i', $string)) { echo'ok'; } elseif (preg_match('/^([A-Z0-9][A-Z0-9_-](?:.[A-Z0-9][A-Z0-9_-])+):?(\d+)?/?/i', $string)) { $string ='http://'.$string; echo'ok'; }

        Wieso rufst du die Prüfung doppelt auf, anstatt das Protokoll im Muster optional zu machen? Das Fragezeichen ist dir doch bekannt. Benutze (https?://)? und entsorge den elseif-Block ersatzlos.

        Du erlaubst, dass eine URL mit einem Punkt beginnt, das ist falsch.

        Du erlaubst, dass eine Domain mit Doppelpunkt endet, auch das ist falsch.

        (\d+)? ist Unsinn, es erlaubt mindestens (+) eine Ziffer (\d), und dieses ein- oder keinmal (?). Da kannst du auch gleich \d* schreiben.

        1. Zu testen ob eine URL tatsächlich sicher eine ist ist technisch eh unmöglich.

          Teste auf das protokoll am anfang und füge es hinzu, wenn es fehlt.