RegExp: URL korrekt erkennen
niehztog
- php
Hallo,
ich bastle momentan an einem Regulären Ausdruck, der aus einem Fließtext sämtliche .com, .net, .org und .de URL's herausfiltern soll. Interessant ist für mich nur der teil der URL bis exakt zur TLD ohne Subdomains. Erkannt werden sollen nach Möglichkeit auch reine Domains ohne http oder www. Ich benutze PHP4 und die Funktion preg_match_all.
Das ist der aktuelle Stand meiner Bemühungen:
\S+\.(?:com|net|org|de|){1}
Das \S deswegen, weil auch neue IDN Domains mit Sonderzeichen erkannt werden sollen.
Leider hat mein Ausdruck noch Probleme mit URLs wo Satzzeichen wie z.b. Klammern unmittelbar vor der URL stehen:
(rollmops.de)
(http://www.rumala.net)
Hier wird die öffnende Klammer imemr miterkannt, weil sie ja in \S enthalten ist.
http://www.gallox.de,http://www.julon.de
Sowas wird als ein Ganzes erkannt und nicht als zwei getrennte Übereinstimmungen.
Ich bin für jeden hilfreichen Tip dankbar.
Gruss
niehztog
Hello,
Das ist der aktuelle Stand meiner Bemühungen:
\S+.(\W{2,}).(?:com|net|org|de|){1}
Und so?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Der tuts bei mir irgendwie nicht. Ist da nicht auch ein . zuviel? Ich will ja subdomains nicht extra behandeln.
Hello,
Das ist der aktuelle Stand meiner Bemühungen:
\S+.(\W{2,}).(?:com|net|org|de|){1}
>
> Und so?
>
>
>
> Liebe Grüße aus Syburg bei Dortmund
>
> Tom vom Berg
> ![](http://selfhtml.bitworks.de/Virencheck.gif)
>
>
Hello,
Der tuts bei mir irgendwie nicht. Ist da nicht auch ein . zuviel? Ich will ja subdomains nicht extra behandeln.
(?:\S+.)*(\W{2,}).(?:com|net|org|de|){1}
dann vielleicht so als nächster Schritt?
Das ist zwar auch noch nicht ausgegoren -> siehe Cheatahs Post
aber könnte schon in die passende Richtung gehen.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Der (und auch dein erster) erkennen bei mir nur die Domains mit arabischen zeichen. Interessanter Weise.
Hello,
Der tuts bei mir irgendwie nicht. Ist da nicht auch ein . zuviel? Ich will ja subdomains nicht extra behandeln.
(?:\S+.)*(\W{2,}).(?:com|net|org|de|){1}
dann vielleicht so als nächster Schritt?
Das ist zwar auch noch nicht ausgegoren -> siehe Cheatahs Post
aber könnte schon in die passende Richtung gehen.
Hi,
http://www.gallox.de,http://www.julon.de
Sowas wird als ein Ganzes erkannt und nicht als zwei getrennte Übereinstimmungen.
Deine RegExp basiert darauf, dass so ziemlich alle Zeichen genommen werden, bis auf sehr, sehr wenige Ausnahmen. Gib statt dessen genau diejenigen Zeichen an, die jeweils erlaubt sind, und markiere optionale Teile als solche. Betrachte das "www" *nicht* gesondert.
Cheatah
Nachtrag für alle die, die es interessiert:
ich probiere es jetzt hiermit:
(?:[a-zA-Z0-9-_\u00A1-\uFFFF]|.|:|/){2,}.(?:com|net|org|de){1}
Der scheint ganz gut zu klappen, ich kann nur nicht testen, ob auch wirklich alle Aisatischen/Arabischen/Kyrillischen usw. Zeichen von dem \u00A1-\uFFFF abgedeckt sind. Vielleicht weiß jemand mehr?
Hi,
ich probiere es jetzt hiermit:
(?:[a-zA-Z0-9-_\u00A1-\uFFFF]|.|:|/){2,}.(?:com|net|org|de){1}
gar nicht mal so schlecht, der Anfang. Jedoch wird "http://" u.ä. nicht ordentlich beachtet, der Port sollte separiert werden, eventuelle User-Name-und Passwort-Teile könnten beachtet werden, der Unterstrich ist in Hostnamen aber sowas von ungültig, und es kann ganz hervorragend einbuchstabige Domains geben. Arbeite am besten mit Hostparts, anstatt alles in einem erschlagen zu wollen.
Cheatah
Muss meine aussage leider nochmal zurücknehmen. Der genannte Ausdruck liefert "Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset 16"
Username und Passwort teile sind bei meinem Anwendungsfall auch nicht weiter interessant. Ich brauch eigentlich nur die Komplette URL, ohne das in einzelne Teile zu zersplitten.
WAs kann ich jetzt wegen dem Fehler tun?
Hi,
ich probiere es jetzt hiermit:
(?:[a-zA-Z0-9-_\u00A1-\uFFFF]|.|:|/){2,}.(?:com|net|org|de){1}gar nicht mal so schlecht, der Anfang. Jedoch wird "http://" u.ä. nicht ordentlich beachtet, der Port sollte separiert werden, eventuelle User-Name-und Passwort-Teile könnten beachtet werden, der Unterstrich ist in Hostnamen aber sowas von ungültig, und es kann ganz hervorragend einbuchstabige Domains geben. Arbeite am besten mit Hostparts, anstatt alles in einem erschlagen zu wollen.
Cheatah