Regex um URL zu identifizieren

Folgendes sollte eine URl erkennen:

Dazu hab ich dies in eine if Abfrage geseteckt.

Jedoch kommt nun folgende Fehlermeldung
[attachment=0]ClubFreeware - Links - Mozilla Firefox 4.0 Beta 6.jpg[/attachment]

Ist der Regex falsch oder was hab ich falsch gemacht?

Verdammt, willst du wirklich dass wir das lesen???

Wie wärs denn damit?

at2.php.net/manual/de/book.filter.php

Sorry, hab den Regex von hier: flanders.co.nz/2009/11/08/a-good … on-repost/
Wahrscheinlich hab ich irgendetwas falsch gemacht, glaub nicht dass der Regex falsch ist.

[quote]Wie wärs denn damit?

at2.php.net/manual/de/book.filter.php[/quote]
Also so wie ich das verstehe überprüft das die URL auf Gültigkeit, deshalb sollte es so eigentlich klappen.

Habs natürlich gleich mal getestet, jedoch scheint es jediglich zu prüfen ob in der var hppt:// zu finden ist, also nicht passend.

Könnt ihr mir dabei helfen den Fehler zu bestimmen? Was bedeutet der überhaupt?

Hast du dich informiert, was es bei der Nutzung von regulären Ausdrücken über die PCRE-Funktionen mit den „Delimitern“ auf sich hat?

weiss nicht genau was du meinst.

Vor und nach den Regex einen Delimiter, z.B. / und es sollte gehen.

Du weißt nicht, was ich meine, wenn ich dich frage, ob du versucht hast, dich zu informieren und selber eine Lösung zu finden …?

Vielen Dank Mgier. Nun funktionierts einwandfrei :wink:
Keine Ahnung was ich dabei überlegt hab, aber ich habs mal mit \ versucht. Wieso nicht mit /, bzw. wieso überhaupt weiss ich gar nicht mehr.

@ chrisb
Gut wenn dus weisst :wink:

Also das wäre in etwa das, was ich mir selbst auf die Schnelle aus dem finger saugen würde:

(http://|ftp://)?  //Protokoll
([a-zA-Z0-9\-_]+\.)+ //Domain
[a-zA-Z]{2,4} //TLD
(/
 [a-zA-Z0-9\.\-/_]* //Pfad
 (#
  .* //Anker
 )?
)?
preg_match("!(http://|ftp://)?([a-z0-9\-_]+\.)+[a-z]{2,4}(/[a-z0-9\.\-/_]*(#.*)?)?!i", $linkadresse)

Da fehlt noch der Query-String, kannst du ja fertig machen wenn du willst :p

Allerdings würde ich filter_var deutlich vorziehen, da es den RFC-Standard einhält und auch um einiges schneller ist.
Wenn du einen Pfad erzwingen willst, gibt es ein Flag dafür.

Dann wird das dein Regex auch nicht anders machen, wenn er sich an den Standard hält :p

//Nachtrag, filter_var funktioniert meines Erachtens perfekt:

var_dump(filter_var("http://uri.tld/datei.txt", FILTER_VALIDATE_URL));
var_dump(filter_var("http://ungültige-domain?.com/datei.txt", FILTER_VALIDATE_URL));
var_dump(filter_var("kein_protokoll.com/datei.txt", FILTER_VALIDATE_URL));
var_dump(filter_var("http://mit_query.com/?lol=123&lal=456", FILTER_VALIDATE_URL));
var_dump(filter_var("http://mit_port.com:345/", FILTER_VALIDATE_URL));
var_dump(filter_var("http://ungueltiger_port.com:345525/", FILTER_VALIDATE_URL));
var_dump(filter_var("http://user:password@passwort.com/", FILTER_VALIDATE_URL));
var_dump(filter_var("ftp://ohne_tld/date.txt", FILTER_VALIDATE_URL));
string 'http://uri.tld/datei.txt' (length=24)
boolean false
boolean false
string 'http://mit_query.com/?lol=123&lal=456' (length=37)
string 'http://mit_port.com:345/' (length=24)
boolean false
string 'http://user:password@passwort.com/' (length=34)
string 'ftp://ohne_tld/date.txt' (length=23)

Also so wie ichs jetzt gelöst hab (mit dem Ellenlangen Regex) funktionierts perfekt :wink: Vielen Dank nochmal.

Der Regex braucht sicher ewig lange bis er fertig ist. Ich glaube nicht, dass sich das noch im annehmbaren Bereich befindet :astonished: