| 

.NET C# Java Javascript Exception

0

PHP kann URLs auslesen und die so gewonnenen Daten analysieren und verarbeiten. Der folgende Workshop zeigt, welche Techniken und Methoden zur Verfügung stehen.

Normalerweise läuft PHP als Teil eines Webservers und sendet Inhalte an die Browser der Anwender. Der typische Ablauf ist bekannt: Ein Client sendet via Browser eine Abfrage an den Server. Der erkennt zum Beispiel an Hand der Endung, dass es sich um ein PHP-Skript handelt und schickt es an dem PHP-Interpreter. Die von diesem erzeugten Ergebnisse schickt der Server dann an den Client.

Der Ablauf kann aber auch anders sein. Ein PHP-Skript kann auch eine entfernte URL quasi wie eine Datei behandeln, diese öffnen, den Inhalt auslesen und nach belieben manipulieren und Ergebnisse wahlweise an einen Client ausgeben, in einer Datei auf dem aufrufenden Server abspeichern oder in einer Datenbank ablegen. Es gibt vier Möglichkeiten, mit PHP einen entfernten URL zu lesen. Die Wahl der Mittel hängt davon ab, welche Anforderungen Sie bezüglich Einfachheit, Kontrollierbarkeit und Portabilität stellen.

Die Arbeit mit fopen( ) ist einfach und bequem und sie folgt automatisch Umleitungen (Redirects). Wenn Sie also mit dieser Funktion das Verzeichnis http://www.example.com/people auslesen möchten und der Server Sie an http://www.example.com/people/ verweist, erhalten Sie den Inhalt der Index-Seite des Verzeichnisses, aber keine Nachricht darüber, dass der URL verlegt worden ist. fopen( ) funktioniert sowohl mit HTTP als auch mit FTP. Zu den Nachteilen von fopen( ) gehört, dass sie nur mit HTTP-GET-Anfragen umgehen kann (nicht mit HEAD oder POST) und Sie mit der Anfrage keine zusätzlichen Header oder Cookies versenden können. Außerdem können Sie mit ihr nur den Response-Body auslesen und keine Response-Header.

Fremde Seite auslesen

Ein Miniskript, das zum Beispiel der Startseite von Spiegel.de (www.spiegel.de) zu Leibe rückt, öffnet die durch die URL vorgegebene HTML-Datei und gibt die Datei zeilenweise ohne HTML-Tags wieder.

<?php
$fd = fopen ("http://www.spiegel.de/", "r");
while (!feof($fd)) {
$buffer = fgetss($fd, 4096);
echo $buffer;
}
fclose ($fd);
?>

Mit zwei einfachen PHP-Befehlen lässt sich jegliches HTML-Markup entweder schon beim Einlesen oder später aus einer Variablen entfernen. Es handelt sich dabei um die Dateifunktion fgetss() und die Stringfunktion strip_tags .
Das Ergebnis ist allerdings wenig brauchbar, da das Ergebnis ein unübersehbarer Buchstabensalat darstellt. Man wird also nicht umhin kommen, das Material erst mal inklusive Markup einzulesen und dann diverse String-Funktionen von PHP für die diffizile Sezierung einzusetzen.

Schon die Stringfunktion strip_tags erlaubt mit Hilfe von Parametern eine differenziertere Herangehensweise. Die Syntax der Funktion lautet string strip_tags ( string str [, string allowable_tags] ) . In dem String allowable_tags lassen sich HTML-Tags definieren, die nicht entfernt werden sollen. Damit lassen sich zum Beispiel strukturierende Tags wie <p> , <br /> oder von der Säuberung ausnehmen. Der erforderliche Code würde so aussehen:

<?php
$fd = fopen ("http://www.spiegel.de", "r");
while (!feof($fd)) {
$buffer = fgets($fd, 4096);
$ausgabe = strip_tags ( $buffer, "<p><br /><br><div>" );
echo $ausgabe;
}
fclose ($fd);
?>

Beim Betrachten der Ausgabe dieses Skripts erkennt man schnell die wesentlich verbesserte Übersichtlichkeit, die ein differenzierteres Aussondern von HTML-Tags mit sich bringt. Allerdings befriedigt das Ergebnis immer noch nicht ganz, insbesondere wenn es darum geht, einen bestimmten Ausschnitt aus der eingelesenen Seite zu extrahieren. Hier helfen nur weitere Stringfunktionen von PHP und ein genauer Blick auf den Quellcode der Seite weiter.

Im folgenden Beispiel soll die Linksammlung aus einem bestimmten Themengebiet aus der Anzeige des Open-Directory-Project Dmoz (www.dmoz.de) extrahiert werden.

Dazu zuerst ein Blick auf den Aufbau einer typischen Dmoz-Seite: Wenn Sie sich zum Beispiel über die Katalogstruktur zu den aktuellen Nachrichten in der Rubrik Medien vorarbeiten, können Sie aus dem Adressen-Feld des Browser den URL für einen Direktaufruf der Seite ersehen: http://dmoz.org/World/Deutsch/Medien/Aktuelle_Nachrichten/ . Diese Seite muss unser Skript also einlesen. Als nächstes muss die Seite auf signifikante Strukturelemente untersucht werden, die dem Skript beim Extrahieren des gewünschten Absatzes helfen können. Sie sind unschwer und ohne einen Blick in der Quelltext der Seite zu erkennen: Die Linksammlung wird von zwei horizontalen Linien () eingerahmt und mit Hilfe von Listenelementen (<ul><li> ) strukturiert.

Damit lässt sich arbeiten: Es gilt also, die vierte horizontale Linie in dem eingelesenen String zu ermitteln, dann die fünfte und schließlich die dazwischenliegende Liste zu extrahieren. Das folgende Listing setzt diese Vorgaben um:

<?php
// Einlesen der gesamten Seite in einen String
$url = file_get_contents ("http://dmoz.org/World/Deutsch/Medien/Aktuelle_Nachrichten/");
 
//Ermitteln der Positionen der horizontalen Linien
$erste_linie = strpos($url,"<hr>");
$zweite_linie = strpos($url,"<hr>",$erste_linie+1);
$dritte_linie = strpos($url,"<hr>",$zweite_linie+1);
$vierte_linie = strpos($url,"<hr>",$dritte_linie+1);
$fuenfte_linie = strpos($url,"<hr>",$vierte_linie+1);
 
//Extrahieren der Liste mit den Links
$laenge = $fuenfte_linie - $vierte_linie;
$linkliste = Substr($url, $vierte_linie + 4, $laenge - 4);
 
//Ausgabe der Liste
echo iconv("UTF-8", "ISO-8859-1", $linkliste);
?>

Statt einer einfachen Ausgabe der extrahierten Daten kann natürlich auch eine weitere Bearbeitung erfolgen. Denkbar wäre zum Beispiel die Konstruktion einer eigenen Seite, in die das Extrakt eingebaut werden kann, oder einfach die Speicherung der Daten in einem File oder in einer Datenbank.

Einbau in die eigene Seite

Um die Daten innerhalb einer eigene Seite nutzen zu können, ist es notwendig, den extrahierten Block weiter zu bearbeiten. Die vorhandenen Links sollen dabei Variablen zugeordnet werden, aus denen dann eine eigene mit CSS formatierter Katalogseite produziert werden soll. Als grundlegendes Strukturelement wird dafür eine Tabelle verwendet. Zum Aufbau dieser Tabelle werden der eigentliche URL und der damit verbundene Text benötigt. Alle notwendigen Daten befinden sich in der Variable $linkliste . Diese wird wie folgt verarbeitet:

<?php
//Links extrahieren
$bereinigt = strip_tags ( $linkliste, "<a>" );
$links = explode ("<a", $bereinigt);
 
foreach ($links as $value) {
 
$link_ende = strpos($value,"</a>");
$link = Substr($value, 0, $link_ende);
echo "<a".$link."</a><br />";
}
?>

Der Rest ist dann HTML- und CSS-Feinarbeit. Am besten definiert man ein externes CSS-File, in dem zum Beispiel für die Links Hover-Effekte festgelegt werden. Außerdem muss man noch die statischen Elemente der Katalogseite festlegen. Der Aufbau der eigentlichen Tabelle erfolgt dann dynamisch an Hand des vorgestellten Skripts:

<span>echo "<td><a".$link."</a></td>";</span>

Ausweiten lässt sich das Prinzip natürlich auch. Statt einer Rubrik aus Dmoz extrahiert man gleich mehrere und baut die gewonnen Ergebnisse dann durch Zwischenüberschriften strukturiert nacheinander in die Tabelle ein.

Seite nach Array

Es gibt noch weitere Varianten, Inhalte per PHP von fremden Seiten auszulesen und auf dem eigenen Server zu verarbeiten und zu nutzen. In bestimmten Fällen kann die Variante Seite nach Array Vorteile bieten. Vor allem dann, wenn es sich um eine statische Seite handelt, auf der die gesuchten Informationen in einem klar definierten und fixen Zeilenbereich befindet. Genutzt wird dafür die Dateifunktion file von PHP. Sie liest eine Datei (oder eben auch einen URL) zeilenweise in ein Array. Das bringt eine Menge Vorteile mit sich. Wenn Sie zum Beispiel wissen, dass die von Ihnen gewünschte Information auf den Zeilen 227 bis 327 der eingelesenen Webseite zu finden sind, kann das Grabbing mit ein paar Code-Zeilen nach folgendem Muster erfolgen:

<?php
// Einlesen der gesamten Seite in ein Array
 
$lines = file ("http://www.spiegel.de/schlagzeilen/");
 
for ($i = 227; $i <= 327; $i++) {
$bereinigt = strip_tags($lines[$i],"<a>");
echo $bereinigt."<br />\n";
}
?>

Das Miniskript liest die aktuellsten Schlagzeilen von Spiegel Online aus.
Das Verfahren eignet sich auch vorzüglich, um auf einen RSS-Feed zuzugreifen und diesen in eine eigene Seite zu integrieren. Im folgenden Beispiel wird dies demonstriert:

<?php
// Einlesen des ZEIT-Newsfeeds in ein Array
 
$lines = file ("http://newsfeed.zeit.de/politik/index");
 
$item_1 = "<a href =\"".strip_tags($lines[10])."\">".strip_tags($lines[9])."</a>";
$item_2 = "<a href =\"".strip_tags($lines[15])."\">".strip_tags($lines[14])."</a>";
$item_3 = "<a href =\"".strip_tags($lines[20])."\">".strip_tags($lines[19])."</a>";
$item_4 = "<a href =\"".strip_tags($lines[25])."\">".strip_tags($lines[24])."</a>";
 
echo $item_1."<br />";
echo $item_2."<br />";
echo $item_3."<br />";
echo $item_4."<br />";
?>

Das Beispiel zeigt übrigens, dass die Funktion strip_tags auch bei reinem XML-Markup wirkt.
Ob als String oder Array die eingelesenen Daten lassen sich mit einer ganzen Litanei von speziellen PHP-Funktionen analysieren oder manipulieren. Die beiden Kästen geben einen Überblick über die für die String- und Array-Bearbeitung zur Verfügung stehenden PHP-Funktionen.
Reguläre Ausdrücke
Wenn Sie die innerhalb eines HTML-Dokuments enthaltenen URLs herausziehen wollen, können Sie das auch mit Hilfe von Regulären Ausdrücken (RegExp) tun. Die folgende Funktion pc_link_extractor() kann dazu verwendet werden:

function pc_link_extractor($s) {
$a = array();
if (preg_match_all('/<a\s+.*?href=[\"\']?([^\"\' >]*)[\"\']?[^>]*>(.*?)<\/a>/i',
$s,$matches,PREG_SET_ORDER)) {
foreach($matches as $match) {
array_push($a,array($match[1],$match[2]));
}
}
return $a;
}

Und so können Sie diese Funktion in ein Skript einbinden

$links = pc_link_extractor($page);

Die Funktion pc_link_extractor() gibt ein Array zurück. Jedes Element dieses Arrays ist selbst wiederum ein Array, dessen erstes Element das Ziel des Links und dessen zweites Element den verlinkten Text enthält.
Der reguläre Ausdruck in der Funktion erkennt nicht alle Links, zum Beispiel nicht solche, die mit Javascript oder mit hexadezimalen Escape-Sequenzen gebildet werden. Aber bei der Mehrzahl der einigermaßen wohlgeformten HTML-Seiten sollte es funktionieren.

Arbeiten mit Snoopy

Im Web gibt es auch ein paar fertige Anwendungen, die beim Grabbing und bei der Verarbeitung fremder Webinhalte gute Dienste leisten können.

Unter dem Namen Snoopy gibt es zum Beispiel eine PHP-Klasse, die einen Webbrowser simuliert, den man automatisch Webseiten laden und bearbeiten lassen kann. Snoopy liest auf Wunsch Seiten und extrahiert den Text aus HTML-Dokumenten. Man kann mit dem Tool auch nur alle Links einer Seite sammeln. Zahlreiche weitere Funktionen wie das Setzen von User-Agent, Referer und Cookies, die Erweiterung relativer Links zu absoluten und ein einfaches Übermitteln von Formulardaten stehen darüber hinaus zur Verfügung. Snoopy benötigt eine PHP-Version mit Unterstützung für Perl Compatible Regular Expressions. Die aktuelle Version kann man sich unter der Adresse snoopy.sourceforge.net aus dem Web laden.

Die Fähigkeit von Snoopy, aus einer fremden Seite alle Links zu extrahieren, soll an folgendem Beispiel demonstriert werden.

<?
include "Snoopy.class.inc";
$snoopy = new Snoopy;
 
$snoopy->fetchlinks ("http://dmoz.org/World/Deutsch/Medien/Journalismus/");
$i=-1;
while ($snoopy->results) {
$i++;
print "<a href=\"".$snoopy->results[$i]."\">".$snoopy->results[$i]."</a><br>";
}
?>

Das kleine Skript holt sich alle Links von der angewählten Dmoz-Seite, wandelt die Ergebnisse in klickbare Hyperlinks um und gibt diese im Browser aus.

PHP String-Funktionen

PHP stellt eine Reihe nützlicher Funktionen zum Bearbeiten von Strings zur Verfügung:

addslashes: Stellt bestimmten Zeichen eines Strings einen Backslash "\" (Rückstrich) voran
chop: Entfernt Leerzeichen, Tabulatoren und Zeilenvorschübe am String-Ende
chr: Gibt ein einzelnes Zeichen zurück
chunk_split: Zerlegt einen String in Teile gleicher Länge
count_chars: Gibt Informationen über die in einem String enthaltenen Zeichen zurück
echo: Gibt einen oder mehrere Strings aus
explode: Zerteilt einen String anhand eines Trennzeichens
htmlentities: Wandelt alle Sonderzeichen in entsprechende HTML-Codes um
htmlspecialchars: Wandelt Sonderzeichen in HTML-Codes um
implode: Verbindet Array-Elemente zu einem String
join: Join verbindet Array-Elemente zu einem String
ltrim: Entfernt führende Leerraum eines Strings
ord: Gibt den ASCII-Wert eines Zeichens zurück
print: Ausgabe eines Strings
printf: Gibt einen formatierten String aus
rtrim: Entfernt Leerzeichen am String-Ende
sprintf: Gibt einen formatierten String zurück
str_replace: Ersetzt alle Vorkommen eines Strings in einem anderen String
str_word_count: Gibt Informationen über Worte in einem String zurück
strchr: Sucht erstes Vorkommen des gesuchten Zeichens und liefert den Reststring
strip_tags: Entfernt HTML- und PHP-Tags aus einem String
stripcslashes: Umkehrung / Gegenstück zu addcslashes
strlen: Ermitteln der String-Länge
strpos: Sucht erstes Vorkommen des Suchstrings und liefert die Position
strrchr: Sucht letztes Vorkommen des gesuchten Zeichens und liefert den Reststring
strrev: Umdrehen eines Strings
strrpos: Sucht letztes Vorkommen des gesuchten Zeichens und liefert die Position
strspn: Ermittelt die Länge der übereinstimmenden Zeichen
strstr: Sucht erstes Vorkommen des Suchstrings und liefert den Reststring
strtr: Tauscht bestimmte Zeichen aus
substr_count: Ermittelt, wie oft eine Zeichenkette in einem String vorkommt
substr_replace: Ersetzt Text in einer Zeichenkette
substr: Gibt einen Teil eines Strings zurück
trim: Entfernt überflüssige Zeichen am Anfang und Ende eines Strings
wordwrap: Bricht die Zeilen eines Strings nach einer bestimmten Anzahl Zeichen mittels des angegebenen Trennzeichens um.

web php
Schreibe einen Kommentar:
Themen:
php web
Entweder einloggen... ...oder ohne Wartezeit registrieren
Benutzername
Passwort
Passwort wiederholen
E-Mail