lampux
Goto Top

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.


<?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 face-smile

mfg Lampux

Content-Key: 158447

Url: https://administrator.de/contentid/158447

Printed on: April 23, 2024 at 12:04 o'clock

Member: beckslevel91
beckslevel91 Jan 12, 2011 at 09:39:00 (UTC)
Goto Top
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:

$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
Member: Lampux
Lampux Jan 12, 2011 at 10:01:08 (UTC)
Goto Top
Leider kommt bei deiner Lösung eine leere Seite. Kleine Anmerkung am Rande: in Zeile 3 fehlt am Schluss noch eine runde Klammer face-wink . Um das Problem ein bisschen genauer zu erklären:

Im Quelltext kommt diese Stelle einmalig vor. Von dieser Stelle aus, sollte es suchen:

id="tscc.hub.1.home.title" href="

bis zu dieser Stelle, die mehrmals im Quelltext vorkommt:

class="tsc_restitle"

Da diese Stelle mehrfach im Quelltext vorkommt, gibt er mit den ganzen Quelltext von Begin der ersten einmaligen Stelle bis zur letzen vorkommenden class="tsc_restitle" Stelle aus.

Ich möchte einfach nur, das das Gesuch nach dem ersten Finden von class="tsc_restitle" aufhört. Zwischen den beiden Stellen befinden sich ein Link, diesen möchte ich auslesen.

Ich hoffe nun das es ein wenig verständlich war face-smile

mfg Lampux
Member: beckslevel91
beckslevel91 Jan 12, 2011 at 10:09:59 (UTC)
Goto Top
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:

$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. =)
Member: Lampux
Lampux Jan 12, 2011 at 10:29:42 (UTC)
Goto Top
Ich glaube wir sind nahe an der Lösung, leider wirft es noch eine Fehlermeldung:

Parse error: syntax error, unexpected T_VARIABLE in C:\xampp\htdocs\such3.php on line 11

Hier der aktuelle Quelltext:


<?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('class="tsc_restitle"');  
$erstes_Zeichen = strlen('id="tscc.hub.1.home.title" href="')  

$link = substr($quelltext, $erstes_Zeichen, $letztes_Zeichen);
echo $link;
?>
Member: godlie
godlie Jan 12, 2011 at 10:57:30 (UTC)
Goto Top
wie wärs mit einem ; in zeile 9 am ende ? face-smile
Member: Lampux
Lampux Jan 12, 2011 at 12:03:52 (UTC)
Goto Top
Stimmt! Leider kommt nun:

Warning: stripos() expects at least 2 parameters, 1 given in C:\xampp\htdocs\such3.php on line 8
Member: godlie
godlie Jan 12, 2011 at 12:09:15 (UTC)
Goto Top
Dokuvorleseservice php.net/stripos
int stripos ( string $haystack , string $needle [, int $offset = 0 ] )
Member: beckslevel91
beckslevel91 Jan 12, 2011 at 12:53:39 (UTC)
Goto Top
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; 

?>
Member: godlie
godlie Jan 12, 2011 at 13:06:52 (UTC)
Goto Top
Debugservice
$stripos is not defined 

face-smile
Member: beckslevel91
beckslevel91 Jan 12, 2011 at 13:21:05 (UTC)
Goto Top
face-smile

nobody's perfect^^

naja, das wird er jetzt wohl selbst hinbekommen face-smile
Member: Lampux
Lampux Jan 12, 2011 at 16:26:20 (UTC)
Goto Top
Danke Leute. Jedoch zeigt es mir immer noch eine weiße Seite an. Und mit dieser Meldung kann ich leider nichts anfangen:

$stripos is not defined
Member: dog
dog Jan 12, 2011 at 18:53:52 (UTC)
Goto Top
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: .+?
Member: Lampux
Lampux Jan 13, 2011 at 06:39:41 (UTC)
Goto Top
Genau das wollte ich. Vielen Dank, es funktioniert einwandfrei.