Einzelnen Beitrag anzeigen
Alt 08.04.2009, 02:28   #1 (Direktlink)
Destruction
Stammuser
 
Registriert seit: 14.02.2007
Alter: 19
Beiträge: 491
Idee [PHP] Preg_match ( Grundkentnisse Vorausgesetzt )

Autor: Destruction

Nabend,
ich möchte euch eine ganz kurze Einführung in Preg_match schreiben.

=> Wofür benutzt man preg_match?
Preg_match kann man nutzen um zu checken ob ein String einem bestimmten Muster entpricht oder um Daten aus einer Datei bzw. einer Homepage zu holen.

Das 2. werde ich euch heute erklären
( es kommt dann evtl. noch eine weiterführung falls Interesse besteht mit allen RegEx Beschreibungen )

Der einfachste weg um Daten aus einer Datei zu holen ist (.*?)
"." = Jedes beliebiges Zeichen
"*" = Soll 1 mal oder mehr vorkommen
"?" = Normalerweise : Darf vorkommen, muss es aber nicht -> In unserem Fall bringt dies, dass so wenig wie möglich rausgeholt wird. "(.*)"= So viel wie möglich.

So und an welchem Beispiel könnte man es besser erklären als PPF

Wir wollen uns die aktuellen Beiträge auslesen lassen.
So schaut man sich den Quelltext von PPF an sieht man bei (fast) jedem Beitrag den folgenden Aufbau:
HTML-Code:
<a href="http://www.paules-pc-forum.de/forum/ueber-das-forum/113010-heute-grosser-livechat.html" style="white-space:nowrap" ><strong>Heute großer Livechat!</strong></a></span>
Das "fast" steht da, weil noch bei manchen Beiträgen ein "title" rangehängt ist...
Also 1. Schritt:
PHP-Code:
$file file_get_contents("http://www.paules-pc-forum.de/forum"); 
Die Daten von PPF holen sollte der 1. Schritt sein...
Der 2. Schritt ist nun unser preg_match...
Wir benutzen jedoch preg_match_all , was die selbe Funktionen hat, jedoch gibt es einen entscheidenden Vorteil:
preg_match_all durchsucht eine ganze Datei
preg_match durchsucht eine Datei nur bis zum 1. Fund!
Nehmen wir noch mal das Beispiel:
HTML-Code:
<a href="http://www.paules-pc-forum.de/forum/ueber-das-forum/113010-heute-grosser-livechat.html" style="white-space:nowrap" ><strong>Heute großer Livechat!</strong></a></span>
Nun kommen unsere (.*?) ins Spiel.
PHP-Code:
preg_match_all('@<a href="(.*?)" style="white-space:nowrap" ><strong>(.*?)</strong></a></span>@',$file,$matches); 
Vor und nach dem preg_match_all RegEx muss ein Zeichen sein...
Die Zeichen die euch interessieren sollten:
@
#
/
Ich habe nun zu dem @ gegriffen, da es in meinem String nicht vorkommt und ich somit die anderen @ zeichen nicht escapen muss.
Hätte ich nun ein "/" genommen, hätte ich das </a> escapen müssen, d.h. ein "\" davor setzen müssen. Dies kennt ihr sicherlich auch schon aus anderen Funktionen.

So der 2. Parameter ist der zu durchsuchende String, in unserem Falle $file.
3. Parameter: Die Suchergebnisse
PHP-Code:
<?php
$file 
file_get_contents("http://www.paules-pc-forum.de/forum");
preg_match_all('@<a href="(.*?)" style="white-space:nowrap" (title="Zum ersten ungelesenen Beitrag im Thema \'(.*?)\' gehen")?><strong>(.*?)</strong></a></span>
@'
,$file,$matches);
print_r($matches);
?>
Da wie schon gesagt manchmal ein "title" vorkommt klammern wir dies ein und machen ein "?" danach.
"?" = Darf 1 oder 0 mal vorkommen

Wenn wir uns nun mit print_r($matches) das Ergebnis ausgeben lassen, sehen wir mehrere Arrays.

Uns interessiert der 1. Array [0] .
Unsere Ergebnisse sind nun in $matches[0][0] , $matches[0][1] , ... gespeichert.
Um diese nun ausgeben zu lassen benutzen wir die "for" Schleife, die ich nun hier nicht erklären werde, da diese Schleife zu den Grundkentnissen gehört.

PHP-Code:
<?php
$file 
file_get_contents("http://www.paules-pc-forum.de/forum");
preg_match_all('@<a href="(.*?)" style="white-space:nowrap" (title="Zum ersten ungelesenen Beitrag im Thema \'(.*?)\' gehen")?><strong>(.*?)</strong></a></span>
@'
,$file,$matches);
for(
$i=0;$i 34;$i++) {
    echo 
$matches[0][$i]."<br>";
}
?>
Es gibt insgesamt 33 Ergebnisse also soll $i kleiner als 34 sein!
( deswegen $i < 34 )

So ich hoffe ihr habt alles verstanden.
Falls noch Interesse besteht kann ich das Tutorial erweitern und noch richtige RegEx Suchen erklären.

MfG

Geändert von Destruction (08.04.2009 um 02:39 Uhr)
Destruction ist offline   Mit Zitat antworten