Preg match soll nach erster Übereinstimmung beendet werden
Guten Tag,
da ich mir zurzeit die regulären Ausdrücke genauer anschaue und dazu ein paar Übungen mache, bin ich nun auf ein Problem gestoßen. Ich möchte mit preg_match eine bestimmte Stelle vom Quelltext suchen, und dessen Link auslesen. Jedoch kommt das Ende der Stelle im Quelltext öfters vor. Jedoch soll preg_match nach der ersten Übereinstimmung beendet werden, jedoch funktioniert das nicht. Preg_match geht den kompletten Quelltext durch und gibt alle Suchergebnisse bis zum Ende des Quelltextes aus. Hier der original Quelltext, ihr könnt ihn ja testen, falls ihr mir nun nicht richtig verstanden habt.
Es sollte einfach die Quelltextstelle von id="tsc.... bis class="tsc_restitle" ausgeben. Das id="tsc usw. würde ich dann später noch mit str_replace wegfiltern.
Vielleicht sieht ja einer von euch den Fehler
mfg Lampux
da ich mir zurzeit die regulären Ausdrücke genauer anschaue und dazu ein paar Übungen mache, bin ich nun auf ein Problem gestoßen. Ich möchte mit preg_match eine bestimmte Stelle vom Quelltext suchen, und dessen Link auslesen. Jedoch kommt das Ende der Stelle im Quelltext öfters vor. Jedoch soll preg_match nach der ersten Übereinstimmung beendet werden, jedoch funktioniert das nicht. Preg_match geht den kompletten Quelltext durch und gibt alle Suchergebnisse bis zum Ende des Quelltextes aus. Hier der original Quelltext, ihr könnt ihn ja testen, falls ihr mir nun nicht richtig verstanden habt.
<?php
$link = "http://themen.t-online.de/news/baugewerbe";
$quelltext = file_get_contents($link);
preg_match("/ id=\"tscc\.hub\.1\.home\.title\" href=\".+\" class=\"tsc_restitle\"/",$quelltext,$img_tag);
$filter = htmlentities($img_tag);
echo $filter;
?>
Es sollte einfach die Quelltextstelle von id="tsc.... bis class="tsc_restitle" ausgeben. Das id="tsc usw. würde ich dann später noch mit str_replace wegfiltern.
Vielleicht sieht ja einer von euch den Fehler
mfg Lampux
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 158447
Url: https://administrator.de/contentid/158447
Ausgedruckt am: 05.11.2024 um 10:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo Lampux,
ich glaube, dein Problem verstanden zu haben, und hätte folgende Lösung für Dich:
mit der Funktion "stripos" findest du das erste Vorkommen einer Zeichenkette in einem String. Da du weißt, wie lange die Zeichenkette ist, nach der du suchst machst du folgendes:
ist das das was du suchst? Bin mir nicht ganz sicher..
lg
ich glaube, dein Problem verstanden zu haben, und hätte folgende Lösung für Dich:
mit der Funktion "stripos" findest du das erste Vorkommen einer Zeichenkette in einem String. Da du weißt, wie lange die Zeichenkette ist, nach der du suchst machst du folgendes:
$needle = '/ id=\"tscc\.hub\.1\.home\.title\" href=\".+\" class=\"tsc_restitle\"/';
$erstePosition = stripos($quelltext, $needle);
$quelltext = substr($quelltext, 0, ($erstePosition + strlen($erstePosition)); //gibt nur noch den Teil übrigen Teil des Quelltextes aus
ist das das was du suchst? Bin mir nicht ganz sicher..
lg
Hey. Jetzt versteh ich was du meinst. Okay, dann ist die Lösung recht einfach und ähnlich wie oben:
Du suchst das erste "id="tscc.hub.1.home.title" href="" im Quelltext mit "stripos".
Dann zerlegst du den Quelltext anhand dieser Position:
Hats funktioniert ?
lg
PS: Hab mir dein Code nochmal angeguckt. Versuche, weniger zu escapen. Verwende doppelte und einfache Anführungsstriche, das macht es übersichtlicher. =)
Du suchst das erste "id="tscc.hub.1.home.title" href="" im Quelltext mit "stripos".
Dann zerlegst du den Quelltext anhand dieser Position:
$quelltext = substr($stripos, strlen($quelltext));
//jetzt hast du einen Quelltext der erst anfängt, wo der Link beginnt.
//damit kannst du einfach arbeiten: Suche das erste vorkommen von "class="tsc_restitle"":
$letztes_Zeichen = stripos('class="tsc_restitle"');
$erstes_Zeichen = strlen('id="tscc.hub.1.home.title" href="')
$link = substr($quelltext, $erstes_Zeichen, $letztes_Zeichen);
Hats funktioniert ?
lg
PS: Hab mir dein Code nochmal angeguckt. Versuche, weniger zu escapen. Verwende doppelte und einfache Anführungsstriche, das macht es übersichtlicher. =)
Lösungsservice
<?php
$link = "http://themen.t-online.de/news/baugewerbe";
$quelltext = file_get_contents($link);
$quelltext = substr($stripos, strlen($quelltext));
//jetzt hast du einen Quelltext der erst anfängt, wo der Link beginnt.
//damit kannst du einfach arbeiten: Suche das erste vorkommen von "class="tsc_restitle"":
$letztes_Zeichen = stripos($quelltext, 'class="tsc_restitle"');
$erstes_Zeichen = strlen('id="tscc.hub.1.home.title" href="');
$link = substr($quelltext, $erstes_Zeichen, $letztes_Zeichen);
echo $link;
?>
preg_match
sucht im Gegensatz zu preg_match_all
nur ein Vorkommen einer Code-Stelle und gibt das aus.Du hast aber
.+
geschrieben und die Funktion somit greedy gemacht.Spricht: Er gibt alles vom ersten Vorkommen des Textes links vom .+ und alles bis zum letzen Vorkommen des Textes rechts von .+ aus.
Was du willst ist ungreedy:
.+?