Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Preg match soll nach erster Übereinstimmung beendet werden

Frage Entwicklung PHP

Mitglied: Lampux

Lampux (Level 1) - Jetzt verbinden

12.01.2011, aktualisiert 28.01.2011, 3452 Aufrufe, 13 Kommentare

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.





01.
<?php 
02.
 
03.
$link = "http://themen.t-online.de/news/baugewerbe"
04.
 
05.
$quelltext = file_get_contents($link); 
06.
preg_match("/ id=\"tscc\.hub\.1\.home\.title\" href=\".+\" class=\"tsc_restitle\"/",$quelltext,$img_tag); 
07.
$filter = htmlentities($img_tag[0]); 
08.
echo $filter
09.
?>
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

Mit freundlichen Grüßen Lampux
Mitglied: beckslevel91
12.01.2011 um 10:39 Uhr
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:

01.
$needle = '/ id=\"tscc\.hub\.1\.home\.title\" href=\".+\" class=\"tsc_restitle\"/'
02.
$erstePosition = stripos($quelltext, $needle); 
03.
$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
Bitte warten ..
Mitglied: Lampux
12.01.2011 um 11:01 Uhr
Leider kommt bei deiner Lösung eine leere Seite. Kleine Anmerkung am Rande: in Zeile 3 fehlt am Schluss noch eine runde Klammer . 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

Mit freundlichen Grüßen Lampux
Bitte warten ..
Mitglied: beckslevel91
12.01.2011 um 11:09 Uhr
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:

01.
 
02.
$quelltext = substr($stripos, strlen($quelltext)); 
03.
//jetzt hast du einen Quelltext der erst anfängt, wo der Link beginnt. 
04.
//damit kannst du einfach arbeiten: Suche das erste vorkommen von "class="tsc_restitle""
05.
$letztes_Zeichen = stripos('class="tsc_restitle"'); 
06.
$erstes_Zeichen = strlen('id="tscc.hub.1.home.title" href="'
07.
 
08.
$link = substr($quelltext, $erstes_Zeichen, $letztes_Zeichen); 
09.
 
Hats funktioniert ?

lg


PS: Hab mir dein Code nochmal angeguckt. Versuche, weniger zu escapen. Verwende doppelte und einfache Anführungsstriche, das macht es übersichtlicher. =)
Bitte warten ..
Mitglied: Lampux
12.01.2011 um 11:29 Uhr
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:


01.
<?php 
02.
 
03.
$link = "http://themen.t-online.de/news/baugewerbe"
04.
$quelltext = file_get_contents($link); 
05.
$quelltext = substr($stripos, strlen($quelltext)); 
06.
//jetzt hast du einen Quelltext der erst anfängt, wo der Link beginnt. 
07.
//damit kannst du einfach arbeiten: Suche das erste vorkommen von "class="tsc_restitle""
08.
$letztes_Zeichen = stripos('class="tsc_restitle"'); 
09.
$erstes_Zeichen = strlen('id="tscc.hub.1.home.title" href="'
10.
 
11.
$link = substr($quelltext, $erstes_Zeichen, $letztes_Zeichen); 
12.
echo $link
13.
?>
Bitte warten ..
Mitglied: godlie
12.01.2011 um 11:57 Uhr
wie wärs mit einem ; in zeile 9 am ende ?
Bitte warten ..
Mitglied: Lampux
12.01.2011 um 13:03 Uhr
Stimmt! Leider kommt nun:

Warning: stripos() expects at least 2 parameters, 1 given in C:\xampp\htdocs\such3.php on line 8
Bitte warten ..
Mitglied: godlie
12.01.2011 um 13:09 Uhr
Dokuvorleseservice php.net/stripos
01.
int stripos ( string $haystack , string $needle [, int $offset = 0 ] )
Bitte warten ..
Mitglied: beckslevel91
12.01.2011 um 13:53 Uhr
Lösungsservice

01.
<?php  
02.
 
03.
$link = "http://themen.t-online.de/news/baugewerbe";  
04.
$quelltext = file_get_contents($link);  
05.
$quelltext = substr($stripos, strlen($quelltext));  
06.
//jetzt hast du einen Quelltext der erst anfängt, wo der Link beginnt.  
07.
//damit kannst du einfach arbeiten: Suche das erste vorkommen von "class="tsc_restitle"":  
08.
 
09.
$letztes_Zeichen = stripos($quelltext, 'class="tsc_restitle"');  
10.
$erstes_Zeichen = strlen('id="tscc.hub.1.home.title" href="'); 
11.
 
12.
$link = substr($quelltext, $erstes_Zeichen, $letztes_Zeichen);  
13.
 
14.
echo $link;  
15.
 
16.
?>
Bitte warten ..
Mitglied: godlie
12.01.2011 um 14:06 Uhr
Debugservice
01.
$stripos is not defined 
Bitte warten ..
Mitglied: beckslevel91
12.01.2011 um 14:21 Uhr


nobody's perfect^^

naja, das wird er jetzt wohl selbst hinbekommen
Bitte warten ..
Mitglied: Lampux
12.01.2011 um 17:26 Uhr
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
Bitte warten ..
Mitglied: dog
12.01.2011 um 19:53 Uhr
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: .+?
Bitte warten ..
Mitglied: Lampux
13.01.2011 um 07:39 Uhr
Genau das wollte ich. Vielen Dank, es funktioniert einwandfrei.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows 10
Druckerwarteschlange beendet sich (16)

Frage von Hanuta zum Thema Windows 10 ...

Windows Server
Spoolsv beendet sich selbst (OLEAUT32.dll) (5)

Frage von freenode zum Thema Windows Server ...

Notebook & Zubehör
Erster Vergleich: MacBook Pro und Surface Book

Link von runasservice zum Thema Notebook & Zubehör ...

Windows 7
Druckerwarteschlange wird beendet (2)

Frage von MasterSchlumpf zum Thema Windows 7 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...