Camping_RIDER: Externen Link erkennen

Beitrag lesen

Hi T-Rex ;)

Ok wie mache ich das am besten?

Vorausgesetzt das Überprüfen der Nutzereingabe ist der einzige Weg - vielleicht hilft dir der folgende Gedanke weiter (Denkfehler vorbehalten):

Es wurde ja schon angesprochen, dass jeder nicht-interne Link ein externer Link ist. Es genügt also auszuschließen, dass es sich um einen internen Link handelt. Ich denke wir sind schon soweit mit diesem Thema, dass sich PHP um die Linkauswertung kümmern soll.

Interne Links liegen entweder im gleichen Verzeichnis (Anfang ohne Slash), in einem darüberliegenden Verzeichnis (Anfang besteht ausschließlich aus Slash-Punkt-Kombinationen) oder bilden die absolute URL auf die interne Seite ab. Alles andere sind entweder externe Links oder Links mit anderer Bedeutung (z.B. mailto - das möchtest du wahrscheinlich nicht als externen Link markieren, sondern ggf. als E-Mail-Addresse).

Den zweiten Fall zu überprüfen ist einfach: du kannst durch RegExp prüfen, ob am Anfang des Links ein Slash steht gefolgt von einem Zeichen, das kein Slash ist. Wenn ja - ist es ein interner Link.

Nun zu Fall eins:

Du checkst zunächst über RegExp, ob der eingegebene Link vorne mit einem Protokollnamen beginnt - falls ja können wir einen internen Link nach Fall eins ausschließen. Dann genügt direkt die Überprüfung auf Fall drei (sofern dir der Protokollname passt - ich würde z.B. falls es tatsächlich um einen Link geht nur http:// und https:// akzeptieren).

Falls der Link nicht mit Protokollnamen beginnt, untersuchen wir auf Verwendung einer gültigen URL mit Top-Level-Domain. Betrachtest du den Teil des Links vor dem ersten Slash (oder den ganzen Link, sollte kein Slash vorhanden sein) - ich bezeichne das mal als $a - und suchst darin den ersten Punkt von rechts. Wird kein Punkt in $a gefunden, ist es ein interner Link. Wird einer gefunden, so betrachte den Teil von $a zwischen Punkt und String-Ende - ich nenne das mal $b. Jetzt gleichst du $b mit einer Liste aller möglichen Top-Level-Domains ab (vielleicht hat jemand an dieser Stelle eine elegantere Idee...?) - falls keine Übereinstimmung ist der Link intern (denn externe Links verfügen über eine Top-Level-Domain), falls Übereinstimmung prüfe auf Fall drei.

Zuletzt zu Fall drei:

Wir prüfen zunächst wieder, ob ein Protokollname vorne am Link dran hängt und falls ja, machen wir diesen zu Überprüfungszwecken weg. Danach werfen wir alles ab dem ersten Slash weg. Dann werfen wir alles weg, was links von dem zweiten Punkt von rechts steht, weg (hier kommts drauf an, was für dich "intern" bedeutet. Wenn intern nur bedeutet innerhalb der Domain, passt das so. Falls intern nur die Subdomain betrifft, musst du halt einen Punkt weiter gehen). Das was übrig bleibt (also TLD und Domain) vergleichen wir mit deiner eigenen Domain. Falls Übereinstimmung, ist der Link intern. Falls nicht, ist er extern.

Alles was bisher nicht als intern erkannt wurde, ist extern.

Disclaimer: Meine Idee oben versteht sich nicht als Königsweg, vielleicht gibt es eine mir nicht bekannte, viel elegantere Lösung. Es ist vielmehr eine Verfeinerung der "einfachen" Kriterien, die du bisher einsetzt - wie bisher bei dir rein auf der Basis der Nutzereingabe ohne irgendeine Form des Lookup. Meiner Meinung nach deckt meine Idee dann aber doch einen großen Teil der möglichen Eingaben ab. Man kann das ganze noch weiter verfeinern - z.B. indem man an gegebener Stelle überprüft, ob die übergebene Addresse vielleicht gar keine Domain hat, sondern auf eine IP hört, die entweder die eigene oder eine externe sein kann. Die Frage ist immer, wie viel Aufwand man für eine reine "Komfortfunktion" (wie ich es verstanden habe) investieren möchte.

Hoffe, eventuell weitergeholfen zu haben (hatte das Problem selbst auch schon),

RIDER

--

Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller