Mandy: URL richtig testen -> Lösung

Beitrag lesen

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.