[PHP] Title-Tag auslesen

Paladin

Programmierer
ID: 485530
L
16 November 2006
1.651
57
Hallo,
ich lese eine Webseite ein und möchte nun den Webseiten-Titel auslesen, also alles, was zwischen den Title-Tag steht.
Da das ganze sich ja auch über mehrere Zeilen erstrecken kann und ich noch drölfzig andere Sachen an dem Projekt zu machen habe, meine Frage: Wie mache ich das am besten? Danke für eure Hilfe im vorraus...
 
Quick and dirty:
PHP:
echo preg_replace('/^.*<title>(.*?)</title>.*$/isx', '$1', $content);
 
Den Slash escapen ;)
Code:
/^.*<title>(.*?)<[B][COLOR=Red]\[/COLOR][/B]/title>.*$/isx
 
PHP:
echo preg_replace('~^.*<title>(.*?)</title>.*~/isx', '$1', $content);

sollte gehen. Habe einfach nur den Delimeter getauscht um die Kollision zu vermeiden

Greetz
paddya
 
Den Slash escapen ;)
Code:
/^.*<title>(.*?)<[B][COLOR=Red]\[/COLOR][/B]/title>.*$/isx
Ja ne, is klar, wa?
So spät sollte man echt nicht mehr arbeiten.
Danke...

Gibt es eigentlich eine schnelle Lösung für das gleiche Problem, nur mit der Prämisse, dass ich das ganze nicht als String, sondern als array (PHP function file) vorliegen habe?
 
Der Titel kann rein theoretisch über mehrere Zeilen gehen, d.h. da bringt dir das Array nix.

Wenn du also file() nimmst, kannst du mit implode("\n", $array) den String herstellen und Gegenrichtung mit explode("\n", $string) das Array erzeugen.

Die eigentliche Suche mit preg_match() musst du so oder so machen, d.h. es is besser, gleich mit file_get_contents() dir die Webseite als einen String zu geben, anstatt das mit file() erzeugte, unhandliche Array zu holen.
 
Der Titel kann rein theoretisch über mehrere Zeilen gehen, d.h. da bringt dir das Array nix.
Eben deshalb ja die Frage, evtl. hätte ja jemand einen guten Weg gehabt.

Wenn du also file() nimmst, kannst du mit implode("\n", $array) den String herstellen und Gegenrichtung mit explode("\n", $string) das Array erzeugen.
So mache ich es und es funktioniert gut, danke.

Die eigentliche Suche mit preg_match() musst du so oder so machen, d.h. es is besser, gleich mit file_get_contents() dir die Webseite als einen String zu geben, anstatt das mit file() erzeugte, unhandliche Array zu holen.
Naja, unhandlich ist das array für die Title-Sache, für andere Sachen (z.b. Untersuchungen des Headers auf bestimmte Inhalte) ist das array besser geeignet. Ich habe ja nun beides vorliegen, array und string und kann je nach Fall entscheiden, was ich von beiden grade besser benutzen kann.

P.S. Einen schnellen Kurs "Reguläre Ausdrücke auffrischen in x Stunden" kennt ihr wohl nicht? Ist ziemlich lange her, dass ich die Dinger zuletzt gesehen - geschweige denn benutzt - habe.
 
Um es kurz zu machen: Einen RegAusdruck zur Ermittlung der Links (alles im href-Attribut) eines Strings lautet: ???
 
Code:
/<a\s+[^>]*href="?(?P<link>\S+?)"?[^>]*>(?P<text>.*?)<\/a>/isx
Ungetestet, aber sollte so funktionieren.
 
Code:
/<a\s+[^>]*href="?(?P<link>\S+?)"?[^>]*>(?P<text>.*?)<\/a>/isx
Ungetestet, aber sollte so funktionieren.
Irgendwie funktioniert das nicht wie gewollt.
PHP:
$listederlinks = preg_replace('/<a\s+[^>]*href="?(?P<link>\S+?)"?[^>]*>(?P<text>.*?)<\/a>/isx', '$1', $seitealsstring);
Oder mache ich da nochwas falsch?
 
Benutz den mal in Zusammenhang mit preg_match_all(). Mit deiner Variante würdest Du maximal einen Link erkennen können.
PHP:
if (preg_match_all($der_regexp_von_grade, $content, $matches))
{
  echo '<pre>',print_r($matches, true),'</pre>';
}
 
Benutz den mal in Zusammenhang mit preg_match_all().
Okay, schon mal ganz gut, allerdings immernoch zu viel.
Ich möchte _nur_ die Links, die in href stehen, erhalten.
Derzeit bekomme ich diverse Arrays zurück, im ersten stehen schon mal alle Anchor-Tags aus dem HTML-Dokument drin, allerdings mit allem, was ich nicht haben will. Gibt es die Lösung, die mir nur die Links zurückliefert?
 
@paladin: Probier mal folgenden Regexp:
Code:
/<a\s+[^>]*href="?(?P<link>\S+?)"?[^>]*>.*?<\/a>/is
In dem entstehenden Array dürfte ein weiteres mit dem Index link enhalten sein und dieses dürfte das sein, was Dich interessiert.

@chrissel: Der ignoriert unter anderem Whitespace (ist für Kommentare wichtig). Ist hier an dieser Stelle überflüssig, mir rutscht der nur ganz gern mal in meine RegExp.
 
@paladin: Probier mal folgenden Regexp:
Code:
/<a\s+[^>]*href="?(?P<link>\S+?)"?[^>]*>.*?<\/a>/is
In dem entstehenden Array dürfte ein weiteres mit dem Index link enhalten sein und dieses dürfte das sein, was Dich interessiert.
So sieht das ganze - auszugsweise - aus:
...
[link] => Array
(
[0] => i
[1] => i
[2] => h
[3] => h
[4] => h
[5] => h
[6] => h
...
 
Ok, da war der Selektor innendrin doch etwas zu bescheiden gewählt:
Code:
/<a\s+[^>]*href="?(?P<link>[^\s">]+)"?\s*[^>]*>.*?<\/a>/is
Tested! ;)
 
Ok, da war der Selektor innendrin doch etwas zu bescheiden gewählt:
Code:
/<a\s+[^>]*href="?(?P<link>[^\s">]+)"?\s*[^>]*>.*?<\/a>/is
Tested! ;)
In dem Zusammenhang: Wäre es möglich, dabei auch gleich alle # und folgende Zeichen aus dem Link zu entfernen? Oder besser, alles ab dem ersten ? oder # (kann ja auch ohne ? ein # kommen oder auch ohne # ein ?)
 
Jau, das geht. Die Änderung ist auch gar nicht gross:
Code:
/<a\s+[^>]*href="?(?P<link>[^\s#?">]+)"?\s*[^>]*>.*?<\/a>/is