Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Bash, Shell, PHP, Python, Perl, CGI
php-tom
Posts: 35
Joined: 2002-06-28 16:48

Alles Hyperlinks aus einer Datei anzeigen lassen - wie?

Post 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
skep
Posts: 13
Joined: 2003-03-07 11:42

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

Post 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" ...
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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
dspeicher
Posts: 167
Joined: 2002-05-20 20:16
Location: Hörstel

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

Post 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
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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:
skep
Posts: 13
Joined: 2003-03-07 11:42

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

Post 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);

?>
skep
Posts: 13
Joined: 2003-03-07 11:42

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

Post 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);

?>
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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
skep
Posts: 13
Joined: 2003-03-07 11:42

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

Post 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);

?>
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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
skep
Posts: 13
Joined: 2003-03-07 11:42

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

Post 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);

?>
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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
skep
Posts: 13
Joined: 2003-03-07 11:42

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

Post 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);

?>
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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
pollux
Posts: 52
Joined: 2003-03-05 18:55

Regex-Lernen

Post 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
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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]
majortermi
Userprojekt
Userprojekt
Posts: 916
Joined: 2002-06-17 16:09

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

Post 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.
Erst nachlesen, dann nachdenken, dann nachfragen... :)
Warum man sich an diese Reihenfolge halten sollte...
php-tom
Posts: 35
Joined: 2002-06-28 16:48

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

Post 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