ULR validieren

rernanded

Erfahrenes Mitglied
Suche ein Script mit dem ich URLs validieren kann.
Folgende Lösungen hab ich, doch irgendwie klappt keine so richtig.
Die korrekten Eingaben einer URL dürfen so aussehen. Alles andere soll abgelehnt werden.

http://subdomain.domainname.tldhttps://subdomain.domainname.tldhttp://subdomain.domainname.tld/https://subdomain.domainname.tld/http://domainname.tldhttps://domainname.tldhttp://domainname.tld/https://domainname.tld/

PHP:
<!DOCTYPE html>
<html>
<body>

<form action="url_validation.php" method="post">
<input type="text" name="url1" size="100">
<input type="submit" value="check">
</form>

<form action="url_validation.php" method="post">
<input type="text" name="url2" size="100">
<input type="submit" value="check">
</form>

<form action="url_validation.php" method="post">
<input type="text" name="url3" size="100">
<input type="submit" value="check">
</form>


<?php
//$url1 = trim($_POST["url1"]);

$url1 = $_POST["url1"];

if (filter_var($url1, FILTER_VALIDATE_URL)) {
    echo("$url1 is a valid URL");
} else {
    echo("$url1 is not a valid URL");
}
?>

<br /><br /><br />

<?php
//$url2 = trim($_POST["url2"]);

$url2 = $_POST["url2"];

if (filter_var($url2, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)) {
    echo("$url2 is a valid URL");
} else {
    echo("$url2 is not a valid URL");
}
?>

<br /><br /><br />

<?php
//$url3 = trim($_POST["url3"]);

$url3 = $_POST["url3"];

// Removes all illegal characters from an url.
$url3 = filter_var($url3, FILTER_SANITIZE_URL);

if (filter_var($url3, FILTER_VALIDATE_URL)) {
    echo("$url3 is a valid URL");
} else {
    echo("$url3 is not a valid URL");
}
?>

</body>
</html>

MONI
 
Du kannst noch einen RegEx-Filter drauf setzen

PHP:
$options = array('regexp' => '/^https?:\/\/(subdomain\.)?domainname\.tld\/?$/i');

if (filter_input(INPUT_POST ,'url1', FILTER_VALIDATE_REGEXP, array('options' => $options)))
    // TODO Valid
}

Test und Erläuterungen zum Pattern: Regex101 - online regex editor and debugger
 
Zuletzt bearbeitet:
Deine
$options = array('regexp' => '/^https?:\/\/(subdomain\.)?domainname\.tld\/?$/i');

müsste dann aber so aussehen:

$options = array('regexp' => '/^https?:\/\/([a-zA-Z0-9]\.)?[a-zA-Z0-9]\.[a-zA-Z0-9]\/?$/i');

wobei subdomain und domainname auch "-" enthalten kann/darf
und der i modifier schon drin ist

Oder so würde es vllt. reichen:

$options = array('regexp' => '/^https?:\/\/([a-z0-9]\.)?[a-z0-9]\.[a-z0-9]\/?$/i');


"-" fehlt aber nach wie vor und darf bei domainname nicht am Anfang, am Ende und nur max 2mal hintereinander auftauchen.

Sorry aber bin bei regex nicht wirklich gut.

MONI
 
Zuletzt bearbeitet:
Kommen wir zu subdomain und subdomanname.
Ich dachte, die sind vorgegeben.
Ansonsten kannst du [\w-_]+ für die Namen verwenden.
Du musst dir auch überlegen, ob die mit einem Buchstaben beginnen müssen. Dann währe das [a-z][\w-_]*. Und äöü etc, dass ja inzwischen erlaubt ist, müssten auch abgedeckt werden: [a-zäöü][\w-_]*
Das i ist dort schon drin, jedoch beim http nicht.
 
Wo ist das Problem mit deinem anfänglichen Code? Ich fand FILTER_VALIDATE_URL eine sehr gute Lösung. Ggf. musst du noch mit PHP: parse_url - Manual prüfen, ob sowas wie Query tatsächlich nicht vorhanden ist. Dein letzter Regex aus Beitrag #5 funktioniert z. B. nicht mit Unicode Domain Namen.
 
Hi
danke für Deinen Hinweis. Ist aber kein Problem ich schicke die URL durch beide Filter.

Das Ganze muß nicht schnell gehen, nur gründlich. MONI

Einmal durch die RegEx-Version und einmal hierdurch:
PHP:
<?php
//$url3 = trim($_POST["url3"]);

$url3 = $_POST["url3"];

// Removes all illegal characters from an url.
$url3 = filter_var($url3, FILTER_SANITIZE_URL);

if (filter_var($url3, FILTER_VALIDATE_URL)) {
echo("$url3 is a valid URL");
} else {
echo("$url3 is not a valid URL");
}
?>
 
Es sind halt beide Varianten unzureichend und dementsprechend nicht gründlich.
Die FILTER_VALIDATE_URL Variante würde z. B. auch https://www.tutorials.de/threads/ulr-validieren.408467/#post-2114273 zulassen und die Regex-Variante würde https://㯙㯜㯙㯟.com nicht matchen.
 
Die erste URL (htt ... 273) wird im Script-Doppelpack als nicht valide erkannt. Siehe ganz oben meine Anforderungen an die URLs.

Chinesische und sonstige Schriftzeichen kann ich vernachlässigen, weil ich keine derartigen URLs prüfen muß.

Nur a bis z, A bis Z, 0-9 und äöüÄÖÜ sowie ß, wobei mir ß tatsächlich noch Probleme bereitet.

MONI
 
Zurück