Page 1 of 1

Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 11:16
by php-tom
Hallo Profis,

ich suche nach einer Möglichkeit, mit alle Hyperlinks aus einem beliebigen Text anzeigen zu lassen.
Dieser Text kann auch eine HTML-Datei sein.
Absolute Links zu Grafiken (JPG/GIF/PNG) sollen dagegen nicht angezeigt werden.

Ich werde das Gefühl nicht los, dass das am einfachsten mit Regulären Ausdrücken zu realisieren ist, aber die sind leider nicht meine Freunde...

Hat jemand so etwas schon mal gemacht?
Wer kann mir ein Codelet möglichst in PHP zur Verfügung stellen?

Danke für alle Eure Antworten und Tipps!

P.S. Die PHP-FAQ

Wie finde ich alle Links in einer HTML-Datei?
http://www.dclp-faq.de/q/q-regexp-links-finden.html

bringt nicht wirklich weiter, weil ich die Links ja nicht unbedingt in einer HTML-Datei suche (kein "<a href ...")

Gruss aus Mönchengladbach
Thomas

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 14:04
by skep
weil ich die Links ja nicht unbedingt in einer HTML-Datei suche (kein "<a href ...")
Wo suchst du denn sonst noch links ? Denn eigentlich ist in fast jedem Link ein "<a href" ...

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 14:09
by php-tom
Danke erstmal für Deine Antwort.
PHP-Tom wrote: ich suche nach einer Möglichkeit, mir alle Hyperlinks aus einem beliebigen Text anzeigen zu lassen.
Ich spreche nicht von einer HTML-Datei, also gibt es da auch keine "<a href..."
Nehme als weiteres Beispiel vielleicht einfach eine Text-eMail, wo mitten im Text ein Hyperlink steht:

Code: Select all

bla bla bla bla
bla bla bla bla

http://www.rootforum.de

bla bla bla bla
bla bla bla bla
So, und alle Links, die in so einem Text/Mail sind, möchte ich angezeigt bekommen.

Ich hoffe es nun besser und verständlicher dargestellt zu haben und freue mich auf Eure verwertbaren Antworten!

Gruss aus Mönchengladbach
Thomas

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 14:23
by dspeicher
Such doch einfach zeile für zeile nach http:// ab! Link ist link, egal ob da nen bild hinter ist oder nicht... natürlich könntest du das noch ausgrenzen, in dem du gif, jpg und sowas ausschließt.

Realisieren würde ich das mit einem zeilenweise einlesen der datei und dann einfach suchen, mit if-abfragen arbeiten und wenn was gefunden wurde in z.b. eine text-datei oder datenbank schreiben.

helfen sollten da die einzelnen rubriken der php-doku (http://www.php3.de/manual/de/).

gruß

Daniel

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 14:32
by php-tom
DSpeicher wrote:... und dann einfach suchen, mit if-abfragen arbeiten ...
Was heisst denn "einfach suchen"?

Ich möchte nicht die Zeile ZEICHENWEISE von Anfang bis Ende nach "http://" durchsuchen und wenn ich die Position einer Fundstelle gefunden habe bis zum nächsten Blank forschen müssen, um dann in der Differenz der beiden Positionen den Link zu erhalten.
Danke, aber darauf bin ich auch schon selber gekommen... :?

Ich halte diese Vorgehensweise nicht für sonderlich performant und denke, es sollte einfacher mit einem Regulären Ausdruck, ähnlich dem aus der PHP-FAQ, funktionieren.
Nur leider nenne ich mich "PHP-Tom" und nicht "RegEx-Tom"... :wink:
Demzufolge bin ich leider nicht in der Lage, den Ausdruck abzuändern/zu erweitern...

Gruss aus Mönchengladbach
Thomas :wink:

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 15:46
by skep
Probier es mal damit....sollte als Basis erstmal halbwegs funktionieren. Es holt alle Links in dieser Form:

Code: Select all

<a href=http://www.rootforum.de>blabla</a>
http://www.rootforum.de
http://www.rootforum.de
www.rootforum.de
heraus...

Code: Select all

<?php

$file = "blabla.html"; 
$fd = fopen ("$file", "r");
while (!feof($fd)) {
   $buffer = fgets($fd, 4096);
   if (preg_match_all("/((http://|www)([w.]+))/", "$buffer", $parts, PREG_SET_ORDER)) {
     foreach($parts as $matches) { print "$matches[0]<br>"; }
   }
}
fclose ($fd);

?>

Hab noch was verändert..hiermit bekommst du auch php?a=b links heraus

Code: Select all

<?php

$file = "blabla.html"; 
$fd = fopen ("$file", "r");
while (!feof($fd)) {
   $buffer = fgets($fd, 4096);
   if (preg_match_all("/((http://|www)([w.?=;&&#93;+))/", "$buffer", $parts, PREG_SET_ORDER)) {
     foreach($parts as $matches) { print "$matches[0]<br>"; }
   }
}
fclose ($fd);

?>

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 16:08
by skep
ich vergess immer die Hälfte...jetzt auch mit ftp-support :)

Code: Select all

<?php

$file = "blabla.html";
$fd = fopen ("$file", "r");
while (!feof($fd)) {
   $buffer = fgets($fd, 4096);
   if (preg_match_all("/((http://|ftp://|www|ftp)([w.?=;&&#93;+))/", "$buffer", $parts, PREG_SET_ORDER)) {
     foreach($parts as $matches) { print "$matches[0]<br>"; }
   }
}
fclose ($fd);

?>

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 16:21
by php-tom
Super, so muss Code aussehen... kurz und bündig...!

Erstmal vielen Dank, aber die Snipplets funktionieren leider bei mir nicht... :cry:
Es scheint, also ob es Probleme bei URLs wie

Code: Select all

http://www.abc-xyz.de
gäbe... Nach dem Bindestrich wird in der Ausgabe alles abgeschnitten...

Ob Du da nochmal drüber schauen könntest...? Die Hieroglyphen sagen mir leider gar nix... :wink:

DANKE!

Gruss aus Mönchengladbach
Thomas

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 16:24
by skep
PHP-Tom wrote:Es scheint, also ob es Probleme bei URLs wie

Code: Select all

http://www.abc-xyz.de
gäbe...

Code: Select all

<?php

$file = "link.html";
$fd = fopen ("$file", "r");
while (!feof($fd)) {
   $buffer = fgets($fd, 4096);
   if (preg_match_all("/((http://|ftp://|www|ftp)([w.?=;&-]+))/", "$buffer", $parts, PREG_SET_ORDER)) {
     foreach($parts as $matches) { print "$matches[0]<br>"; }
   }
}
fclose ($fd);

?>

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 16:41
by php-tom
OK, super - jetzt klappt es auch mit dem Bindestrich! :lol:

Allerdings werden mir leider nicht die vollständigen Links in der Form

http://www.abc.de/skript.php?op=eintrag ... ragsid=129

angezeigt... Hier wird lediglich der Hostname angezeigt.
Bei Parametern scheint es also noch zu ein wenig hapern...
Erkennst Du die Ursache?

An was man nicht alles denken muss... :?

Ach ja: "erkennt" das Skript auch schon "https"-Aufrufe?


Vielen lieben Dank bis jetzt!!!

Gruss aus Mönchengladbach
Thomas

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 17:05
by skep
PHP-Tom wrote:Allerdings werden mir leider nicht die vollständigen Links in der Form

http://www.abc.de/skript.php?op=eintrag ... ragsid=129

angezeigt...

Ach ja: "erkennt" das Skript auch schon "https"-Aufrufe?
Jetzt schon....aber wie gesagt..das ganze ist ziemlich hingeschlampert von mir....also nicht so genau auf den Code gucken ;)

Code: Select all

<?php

$file = "link.html";
$fd = fopen ("$file", "r");
while (!feof($fd)) {
   $buffer = fgets($fd, 4096);
   if (preg_match_all("/((https://|http://|ftp://|www|ftp)([w.?/=;&-;]+))/", "$buffer", $parts, PREG_SET_ORDER)) {
     foreach($parts as $matches) { print "$matches[0]<br>"; }
   }
}
fclose ($fd);

?>

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 17:11
by php-tom
SUPER - es klappt!!! Genau das ist es, was ich gesucht habe!!!

Klasse, prima - vielen Dank, skep!!!
skep wrote:das ganze ist ziemlich hingeschlampert von mir
Ich wünschte, ich könnte so was tolles schlampern... :wink:


Gruss aus Mönchengladbach
Thomas

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 17:22
by php-tom
Ach, eines fällt mir gerade noch auf:

Anker werden nicht angezeigt:
Ob das wohl noch relativ leicht und schnell zu erweitern wäre - oder sprengt das nun das Skript...?


Gruss aus Mönchengladbach
Thomas

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 17:32
by skep
PHP-Tom wrote:Anker werden nicht angezeigt:
Schau dir mal genau an was ich geändert habe..dann kannst du es beim nächsten Update selber ;)

Code: Select all

<?php

$file = "link.html";
$fd = fopen ("$file", "r");
while (!feof($fd)) {
   $buffer = fgets($fd, 4096);
   if (preg_match_all("/((https://|http://|ftp://|www|ftp)([w.?/=;&-;#]+))/", "$buffer", $parts, PREG_SET_ORDER)) {
     foreach($parts as $matches) { print "$matches[0]<br>"; }
   }
}
fclose ($fd);

?>

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2003-03-11 17:39
by php-tom
Yep, jetzt funzt es! Vielen Dank!!!
skep wrote:Schau dir mal genau an was ich geändert habe..dann kannst du es beim nächsten Update selber ;)
Ich sehe es zwar, aber verstehen tue ich es nicht... sorry. Diese regulären Hieroglyphen kriege ich einfach nicht in mein Brain - hab´s schon so oft versucht, aber da versagt mein Intellekt... :cry:

Sorry, dass ich Dich so genervt habe, skep - Du hast mir wirklich sehr geholfen! Hast was gut bei mir - wenn Du also mal etwas brauchst -> PN!

Gruss aus Mönchengladbach
Thomas

Regex-Lernen

Posted: 2003-03-15 18:48
by pollux
Hallo,

Regex sind sehr mächtig und es macht eigentlich Spaß, sie einzusetzen. Ich finde, bei Perl ist ein gutes Tutorial dabei.
Einfach am Prompt "man perlretut" (für PERL REgex TUTorial) tippen. Bei meinem Root-Server (Suse 7.2 ist das zwar noch nicht dabei, aber daheim auf meinem Suse 7.3 schon).

Grüße

Pollux

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2004-03-04 17:29
by php-tom
Der vorbenannte RegEx versieht jetzt schon einige Monate prima seinen Dienst - aber nun kommen ja die neuen Umlautdomains und die möchte ich auch vom RegEx erfassen lassen...

Zur Erinnerung - ich verwende diesen RegEx, um alle vollständigen URLs (nur http/s) inkl. aller Parameter, Anker etc. aus einem Text zu extrahieren:

Code: Select all

preg_match_all("/((https://|http://)([w.?/=,%&-;:+$@#]+))/i", "$text", $parts, PREG_SET_ORDER)

Klappt einwandfrei, allerdings erkennt er die neuen IDN-Sonderzeichen nicht - die müsste ich ihm jetzt noch beibringen, aber ich schaffe es einfach nicht, bzw. ich will nicht alle Zeichen einzeln in den RegEx einbringen (da ich auch nicht weiss, ob das so einfach zeichensatztechnisch möglich ist). Gibt es da keine Möglichkeit, einen "Character-Range" auf Dezimalcode-Basis in den obigen RegEx einzubauen, damit auch die neuen möglichen Zeichen erkannt werden?

Ihr würdet mir echt sehr helfen!!! Danke im voraus!


Gruss,
Thomas[/code]

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2004-03-04 19:19
by majortermi
PHP-Tom wrote:Klappt einwandfrei, allerdings erkennt er die neuen IDN-Sonderzeichen nicht - die müsste ich ihm jetzt noch beibringen, aber ich schaffe es einfach nicht, bzw. ich will nicht alle Zeichen einzeln in den RegEx einbringen (da ich auch nicht weiss, ob das so einfach zeichensatztechnisch möglich ist). Gibt es da keine Möglichkeit, einen "Character-Range" auf Dezimalcode-Basis in den obigen RegEx einzubauen, damit auch die neuen möglichen Zeichen erkannt werden?[/code]
Entweder du masst erst den Domain-Part dekodieren, oder deine RegExp-Implementierung muss Unicode-fähig sein, ansonsten macht der Umgang mit IDNs nämlich keinen Sinn.

Re: Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Posted: 2004-03-05 09:31
by php-tom
Domains vorher dekodieren geht leider nicht - die stehen schon als IDN im Text drin. Bleibt also nur die Unicode-Implementierung - aber da weiss ich absolut nicht, wie ich das machen soll...
Hat so etwas schon mal jemand gemacht und kann mir helfen?

Danke!

Gruss,
Thomas