Regex für die neuen Umlautdomains
René
- programmiertechnik
0 eisbaer040 Sven Rautenberg0 René0 Thomas Luethi0 René
0 MudGuard0 René
Hallo,
ich habe einige PHP-Scripts, die eine Eingabe in der Form:
http://www.domain.de
umwandeln in:
<a href="http://www.domain.de">http://www.domain.de</a>
Da es nun die Umlautdomains gibt, werde ich wohl oder übel die entsprechende Regex die das macht umschreiben müssen. Meine bisherige Lösung sieht so aus:
$text=preg_replace("/(https?://)(www.)?([a-zA-Z0-9-]+.)?([a-zA-Z0-9-]+.[a-zA-Z]{2,5})([a-zA-Z0-9.-?~/=%]+[/~a-zA-Z0-9])?/","<a href="\1\2\3\4\5">\1\2\3\4\5</a>",$text);
Ist es denn überhaupt problemlos möglich slch eine Regex um Umlaute und ß zu erweitern? Immerhin sind es ja Sonderzeichen. Werden die normal in die Regex behandelt? In Perl dürfte es ja das gleiche Problem geben. Wer hat sich denn schon mit dem Thema neue Sonderzeichendomains bei der Programmierung beschäftigt?
schönen Gruß
René
(Der die neuen Domains einfach doof findet und vermutet das es bald viele Probleme geben wird)
Hallo,
Hai,
ich habe einige PHP-Scripts, die eine Eingabe in der Form:
http://www.domain.de
umwandeln in:
<a href="http://www.domain.de">http://www.domain.de</a>Da es nun die Umlautdomains gibt, werde ich wohl oder übel die entsprechende Regex die das macht umschreiben müssen. Meine bisherige Lösung sieht so aus:
$text=preg_replace("/(https?://)(www.)?([a-zA-Z0-9-]+.)?([a-zA-Z0-9-]+.[a-zA-Z]{2,5})([a-zA-Z0-9.-?~/=%]+[/~a-zA-Z0-9])?/","<a href="\1\2\3\4\5">\1\2\3\4\5</a>",$text);
Schreib statt
[a-zA-Z0-9-]
lieber das - an den Anfang der Zeichenklasse, da es so in einigen "Dialekten" Probleme geben kann. Gewöhn dir das lieber so an, dann fällt die Übernahme in andere Programmiersprachen oder Skipte leichter. Außerdem brauchst du es dann nicht zu maskieren.
[-a-zA-Z0-9]
Ist es denn überhaupt problemlos möglich slch eine Regex um Umlaute und ß zu erweitern? Immerhin sind es ja Sonderzeichen. Werden die normal in die Regex behandelt?
Das ist auch vom Encoding abhängig, aber theoretisch sollte
[a-zA-ZÖÄÜöäüß]
funktionieren. Leider hab ich jetzt nicht die Möglichkeit zu testen.
In Perl dürfte es ja das gleiche Problem geben. Wer hat sich denn schon mit dem Thema neue Sonderzeichendomains bei der Programmierung beschäftigt?
Also ich nicht ;-)
schönen Gruß
viel Spaß beim Testen
René
eisbaer04 (der auch René heißt)
(Der die neuen Domains einfach doof findet und vermutet das es bald viele Probleme geben wird)
Ich freu mich schon auf die Russischen Domains (ввв.гугзл.ру) ;-)
Hallo,
Ist es denn überhaupt problemlos möglich slch eine Regex um Umlaute und ß zu erweitern? Immerhin sind es ja Sonderzeichen. Werden die normal in die Regex behandelt?
Das ist auch vom Encoding abhängig, aber theoretisch sollte
[a-zA-ZÖÄÜöäüß]
funktionieren. Leider hab ich jetzt nicht die Möglichkeit zu testen.
Also das geht so zwar schon, aber bei mir aus dem Grund dann wieder nicht, weil ich die Sonderzeichen vorher umwandle und http://www.spaß.com ist eben was anderes als http://www.spaß.com
schönen Gruß
René
Hai,
Hallo,
Also das geht so zwar schon, aber bei mir aus dem Grund dann wieder nicht, weil ich die Sonderzeichen vorher umwandle und http://www.spaß.com ist eben was anderes als http://www.spaß.com
dann pack di ganze sache in eine Alernation:
([a-zA-ZÖÄÜöäüß]|Ö|Ä|...])
schönen Gruß
René
Thats all Folks
eb4
Moin!
Da es nun die Umlautdomains gibt, werde ich wohl oder übel die entsprechende Regex die das macht umschreiben müssen. Meine bisherige Lösung sieht so aus:
$text=preg_replace("/(https?://)(www.)?([a-zA-Z0-9-]+.)?([a-zA-Z0-9-]+.[a-zA-Z]{2,5})([a-zA-Z0-9.-?~/=%]+[/~a-zA-Z0-9])?/","<a href="\1\2\3\4\5">\1\2\3\4\5</a>",$text);
Dein regulärer Ausdruck ist in mehrerer Hinsicht fehlerhaft.
Punkt 1: "Umlautdomains" bedeutet nicht nur, dass jetzt "äöüß" im Namen vorkommen dürfen, sondern wesentlich mehr Zeichen. Wie erwähnt wurde: Russisch, Chinesisch, Japanisch...
Punkt 2: Warum zum Teufel müssen Domains mit "www" beginnen? Warum kann ein Domainnamen nur eine begrenzte Anzahl an Teilen enthalten (die Punkte in der Domain sind bei deinem Ausdruck begrenzt)? Warum gehst du von einer maximalen Top-Level-Domain-Länge von fünf aus - was ist mit ".museum"?
Mit anderen Worten: Du erfaßt ohnehi nur eine Teilmenge existierender Domains und setzt diese in Links um - warum machst du dir dann Gedanken über die Umlaute.
Was besser wäre: Entweder setzt du Links nicht automatisch, sondern nur auf Anforderung des Benutzers um (so wie hier im Forum auch, mit < >, siehe </faq/>), oder du setzt einfach einen wesentlich freizügigeren Regex ein, der auf das Vorhandensein von "http://" prüft und alles, was dahinter kommt (ausgenommen Leerzeichen) in einen Link wandelt). Und mit "alles" ist dann wirklich alles gemeint, also [^ ]+ im Regex.
- Sven Rautenberg
Hallo,
$text=preg_replace("/(https?://)(www.)?([a-zA-Z0-9-]+.)?([a-zA-Z0-9-]+.[a-zA-Z]{2,5})([a-zA-Z0-9.-?~/=%]+[/~a-zA-Z0-9])?/","<a href="\1\2\3\4\5">\1\2\3\4\5</a>",$text);
Dein regulärer Ausdruck ist in mehrerer Hinsicht fehlerhaft.
Punkt 1: "Umlautdomains" bedeutet nicht nur, dass jetzt "äöüß" im Namen vorkommen dürfen, sondern wesentlich mehr Zeichen. Wie erwähnt wurde: Russisch, Chinesisch, Japanisch...
Ist mir klar, aber das Script wird im deutschsprachigen Raum eingesetzt und ich habe diese Zeichen ja nicht mal auf der Tastatur.
Punkt 2: Warum zum Teufel müssen Domains mit "www" beginnen?
Wo bitte verlangt meine Regex das? Da steht: (www.)? Das ? steht für optional. Der Ausdruck funktioniert hervorragend auch ohne eine www-Domain.
Warum kann ein Domainnamen nur eine begrenzte Anzahl an Teilen enthalten (die Punkte in der Domain sind bei deinem Ausdruck begrenzt)?
Der Einwand ist berechtigt, allerdings sind mir in der Praxis bislang noch keine Sub-Subdomains untergekommen.
Warum gehst du von einer maximalen Top-Level-Domain-Länge von fünf aus - was ist mit ".museum"?
Danke für den Hinweis. Wird geändert.
Mit anderen Worten: Du erfaßt ohnehi nur eine Teilmenge existierender Domains und setzt diese in Links um - warum machst du dir dann Gedanken über die Umlaute.
Die Regex dürfte momentan vermutlich 99,9% aller tatsächlich existierenden gültigen Urls erfassen. Bislang hat es noch nie bei einer gültigen Url nicht funktioniert.
Was besser wäre: Entweder setzt du Links nicht automatisch, sondern nur auf Anforderung des Benutzers um (so wie hier im Forum auch, mit < >, siehe </faq/>),
Nein, die Anwendung wird von vielen Nicht-Technikern benutzt. Die stöhnen über so eine "Schikane". Hier im Forum ist das was anderes. Jeder der hier schreibt bringt mindestens HTML-Anfängerwissen mit.
oder du setzt einfach einen wesentlich freizügigeren Regex ein, der auf das Vorhandensein von "http://" prüft und alles, was dahinter kommt (ausgenommen Leerzeichen) in einen Link wandelt). Und mit "alles" ist dann wirklich alles gemeint, also [^ ]+ im Regex.
Hatte ich früher mal, hat sich aber als extrem unzuverläßig erwiesen, denn es gibt z. B. auch die Möglichkeit, daß eine Url mit einem Komme endet mit einem Fragezeichen mit einem Punkt, mit einem Zeilenumbruch etc. Kurzum diese Lösung ist nicht zu gebrauchen.
Wie gesagt die obige Lösung hat sich bereits hervorragend bewährt. Die Möglichkeit für .museum werde ich aber einführen.
schönen Gruß
René
Hallo,
Warum kann ein Domainnamen nur eine begrenzte Anzahl an Teilen enthalten (die Punkte in der Domain sind bei deinem Ausdruck begrenzt)?
Der Einwand ist berechtigt, allerdings sind mir in der Praxis bislang noch keine Sub-Subdomains untergekommen.
Ohne im Detail zu schauen, wie viele Punkte Deine RegEx "durchlaesst":
Ich finde diese Einschraenkung auch nicht sehr sinnvoll.
Gerade Universitaeten haben oft "tiefe" Subdomain-Strukturen.
Besonders in Oesterreich und im Vereinigten Koenigreich ;-)
Aber auch in der Schweiz und in Deutschland.
Teste wenigstens mal mit folgenden URLs:
http://www.zid.uni-linz.ac.at/
http://www.ph.qmw.ac.uk/research_bk/academics.htm
http://www.iaw.agrl.ethz.ch/iaw/d/home.htm
http://www.iha.bepr.ethz.ch/pages/lehre/vorlesungen/vorl.htm
http://www-iam.mathematik.hu-berlin.de/
http://ls7-www.cs.uni-dortmund.de/cgotn/
http://ibe.web.med.uni-muenchen.de/
u.s.w.
Gruesse,
Thomas
Hallo,
Teste wenigstens mal mit folgenden URLs:
http://www.zid.uni-linz.ac.at/
...
Ok, ich werde mir mal überlegen wie ich das verbessern kann.
schönen Gruß
René
Hi,
Warum kann ein Domainnamen nur eine begrenzte Anzahl an Teilen enthalten (die Punkte in der Domain sind bei deinem Ausdruck begrenzt)?
Der Einwand ist berechtigt, allerdings sind mir in der Praxis bislang noch keine Sub-Subdomains untergekommen.
Fast alle britischen Domains haben sub-subdomains, da nach der TLD uk noch eine SLD wie co oder gov oder org oder ...kommt, bevor der erste frei vergebene Name, also die subdomain kommt. Und davor dann noch ein www oder was auch immer als subsub-domain...
Oder die berüchtigten .de.vu, .at.tf, .de.tk usw.
cu,
Andreas
Hallo,
Oder die berüchtigten .de.vu, .at.tf, .de.tk usw.
Nunja, das Konstrukt http://www.domain.co.uk würde ja durchgehen, aber http://nochwas.domain.co.uk nicht mehr. Ebensowenig http://www.nochwas.domain.co.uk. Ich werde also wohl noch ein bis zwei weitere optional Teile in der Art [-a-zA-Z0-9]? einfügen.
schönen Gruß
René