Reg. Ausdruck mit "~"?
Julian Hofmann
- php
Hallo liebes Forum,
achja, wie liiiiebe ich doch reguläre Ausdrücke. Am Wochenende habe ich mich lange damit befasst und auch einiges geschafft, an einer Stelle hänge ich aber jetzt:
Ich möchte eine URL auf Syntaktische Korrektheit prüfen. Mit
if(!ereg("^http://([a-zA-Z0-9-]{2,}.)*[a-zA-Z]{2,3}((/[_a-zA-Z0-9-]+)*(.[_a-zA-Z0-9-]+)*)*$",$url)) { echo "falsch!"; }
erhalte ich auch wunderbar fehlerhafte URLs.
Leider ist hier aber nicht berücksichtigt, daß der Verzeichnisname natürlich auch ein "~" enthalten darf. Erweitere ich aber die letzten beiden Teile jeweils auf [_a-zA-Z0-9-~] bekomme ich ebenso einen Fehler wie bei [_a-zA-Z0-9-~].
Irgendwer eine Ahnung, wo hier der Fehler ist, bzw. wie es möglich ist auch ein "~" zu erlauben?
Grüße aus Köln
Julian
Hi,
Ich möchte eine URL auf Syntaktische Korrektheit prüfen.
wenn Deine RegExp weniger als acht Kilobyte umfaßt (nur die RegExp!), ist sie falsch :-)
Such mal im Forums-Archiv nach "prospero:", dann findest Du die RFC-konforme RegExp; zwar in Perl-Syntax aufgebaut, aber sie sollte nicht allzu schwer auf PHP umzubasteln sein. Wahrscheinlich funktioniert Copy&Paste für den größten Teil.
Mit
if(!ereg("^http://([a-zA-Z0-9-]{2,}.)*[a-zA-Z]{2,3}((/[_a-zA-Z0-9-]+)*(.[_a-zA-Z0-9-]+)*)*$",$url)) { echo "falsch!"; }
erhalte ich auch wunderbar fehlerhafte URLs.
_Einige_ fehlerhafte URLs. Viele richtige werden vermutlich auch als falsch fehlinterpretiert.
Leider ist hier aber nicht berücksichtigt, daß der Verzeichnisname natürlich auch ein "~" enthalten darf.
Wie kommst Du denn darauf? RFC 1738 verbietet die Tilde; richtig wäre an der Stelle ein %7E.
Mir ist allerdings bewußt, daß viele ihre URL falsch angeben.
Erweitere ich aber die letzten beiden Teile jeweils auf [_a-zA-Z0-9-~]
Schau Dir mal die Bindestriche genauer an und überlege Dir ihre Bedeutung. Hinweis: Als letztes Zeichen der Zeichenklasse wird erkannt, daß die Sonderbedeutung nicht hinhaut.
bekomme ich ebenso einen Fehler wie bei [_a-zA-Z0-9-~].
Die Tilde ist nicht das Problem... :-)
Cheatah
Hallo Cheatah,
Such mal im Forums-Archiv nach "prospero:", dann findest Du (...)
Ups, doch sooo wenig darüber. Bei der Suche in Verbindung mit "PHP" erzielte ich keine Treffer.
if(!ereg("^http://([a-zA-Z0-9-]{2,}.)*[a-zA-Z]{2,3}((/[_a-zA-Z0-9-]+)*(.[_a-zA-Z0-9-]+)*)*$",$url)) { echo "falsch!"; }
_Einige_ fehlerhafte URLs. Viele richtige werden vermutlich auch als falsch fehlinterpretiert.
Hm, also wenn ich jetzt nicht gerade passwortgeschütze Bereiche und URL mit Parametern berücksichtigen will, was würde dann groß durchfallen?
Wie kommst Du denn darauf? RFC 1738 verbietet die Tilde;
Ok ok, Tatsache ist aber ja, daß man sich normal eher an dem orientiert, was gemacht wird, als an dem, was richtig wäre (--> Querverweis: HTML-Standards).
[_a-zA-Z0-9-~]
Schau Dir mal die Bindestriche genauer an und überlege Dir ihre Bedeutung. (...)
Tja, das war's wohl. Danke.
Grüße aus Köln
Julian
Hi,
Bei der Suche in Verbindung mit "PHP" erzielte ich keine Treffer.
URLs haben an sich auch nichts mit PHP zu tun ;-)
Hm, also wenn ich jetzt nicht gerade passwortgeschütze Bereiche
Die lassen sich in HTTP-URLs nicht definieren. Defekte Dinge wie "http://bla:blub@domain.de/" würde die RegExp daher natürlich auch nicht als gültig erkennen.
und URL mit Parametern berücksichtigen will, was würde dann groß durchfallen?
Du brauchst nur den Teil $http_url (o.ä.), und kannst da den Query-String ebenfalls ausfallen lassen.
Wie kommst Du denn darauf? RFC 1738 verbietet die Tilde;
Ok ok, Tatsache ist aber ja, daß man sich normal eher an dem orientiert, was gemacht wird, als an dem, was richtig wäre (--> Querverweis: HTML-Standards).
Richtig ist, was in RFC 1738 steht - alles andere sind (ungültige) Anpassungen an schlechte Angewohnheiten. Die Tilde kommt leider deswegen sehr häufig vor, weil sie User-Verzeichnisse unter Unix markiert... die RegExp aus dem Archiv ist bereits dahingehend angepaßt.
Cheatah