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.



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
 

Yaslaw

n/a
Moderator
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:

rernanded

Erfahrenes Mitglied
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:

Yaslaw

n/a
Moderator
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.
 

ComFreek

Mod | @comfreek
Moderator
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.
 

rernanded

Erfahrenes Mitglied
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");
}
?>
 

ComFreek

Mod | @comfreek
Moderator
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.
 

rernanded

Erfahrenes Mitglied
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
 

rernanded

Erfahrenes Mitglied
@Yaslaw Ich weiß nicht genau wie Du es meinst. Von dem Code hier

'/^https?:\/\/([a-zäöü0-9][\w-_]*\.)?[a-zäöü0-9][\w-_]*\.[a-z]*\/?$'

ausgehend, ändere bitte den mal so ab wie es gehen könnte.

MONI
 

rernanded

Erfahrenes Mitglied
@Yaslaw, Du meinst sicher "ß".

Bitte setz doch Deinen Vorschlag

/[\w_äöü&]/i

bitte hier ein

'/^https?:\/\/([a-zäöü0-9][\w-_]*\.)?[a-zäöü0-9][\w-_]*\.[a-z]*\/?$'

damit es klappt. Danke.



MONI
 

Yaslaw

n/a
Moderator
Ach komm, das kriegst du hin. Und ich weiss immer noch nicht was für ein Problem du mit & hast. Willst du einafach alle & zulassen? Wenn es wegen dem URL-Query ist, dann solltest du aber auch ? zulassen, denn es gibt kein & ohne ein ? voraus.
Bitte beschreib GENAU was du haben willst, dann kann ich dein Pattern ev. erweitern
 

rernanded

Erfahrenes Mitglied
$options = array('regexp' => '/^https?:\/\/([a-z0-9_äöüß][\w-_äöüß]*\.)?[a-z0-9_äöüß][\w-_äöüß]*\.[a-z]*\/?$');

Der Code klappt soweit.
Melde mich wenn noch was NICHT klappt.


MONI
 
Zuletzt bearbeitet: