URL richtig testen
Andi
- php
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";
}
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.
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';
}
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.
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.