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, 3476 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

mfg 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

mfg 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 ..
Ähnliche Inhalte
Windows 7
Druckerwarteschlange wird beendet (2)

Frage von MasterSchlumpf zum Thema Windows 7 ...

Windows 10
gelöst Druckerwarteschlange beendet sich (17)

Frage von Hanuta zum Thema Windows 10 ...

Exchange Server
Exchange 2013 Mail flow recipient matches (1)

Frage von EditorialBagPipe zum Thema Exchange Server ...

Outlook & Mail
Suchindizierung wird viel zu früh beendet (6)

Frage von freenode zum Thema Outlook & Mail ...

Neue Wissensbeiträge
Windows Server

Umstellung SHA 1 auf SHA 2 - Migration der CA von CSP auf KSP

Tipp von Badger zum Thema Windows Server ...

Windows 10

Quato DTP94 unter Windows 10 x64 installieren und verwenden

Anleitung von anteNope zum Thema Windows 10 ...

Windows 10

Win10 1703 und Nutzerkennwörter bei Ersteinrichtung - erstaunliche Erkenntnis

(15)

Erfahrungsbericht von DerWoWusste zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Server-Hardware
HP DL380 G7: Booten vom USB via USB 3.1-PCI-e Karte möglich? (24)

Frage von Paderman zum Thema Server-Hardware ...

Windows 7
Bluesreens unternehmensweit (18)

Frage von SYS64738 zum Thema Windows 7 ...

LAN, WAN, Wireless
IP Adressen - Modem - Switch - Accesspoint (17)

Frage von teuferl82 zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
DNS ins mehreren Subnetzen (13)

Frage von joerg zum Thema Windows Netzwerk ...