|
| |
sponsered by
 |
|
| Letztes Update: 16.08.2005 17:53:45 |
|
| |
| * Link führt ins Internet |
|
| |
Einsatz der PCRE-Funktionen
|
|
Nach all den Definitionen und Erläuterungen sollten wir uns nun einigen Beispielen zu wenden. Sie sollten darauf achten, dass die PCRE-Funktionen seit der PHP Version 4.2 standardmässig aktiviert.
Einsatz von preg_match()
Mit Hilfe der Funktion preg_match() können Sie eine Zeichenkette, auf ein Suchmuster durchsuchen. Die Fundstellen werden im Array $matches gespeichert.
Beispiel
<pre>
<?php
// Zeichenkette
$url = "www.atomicscript.de";
// Domainname (Vollständig)
preg_match("/^(http:\/\/)?([^\/]+)/i",
$url, $matches);
print_r($matches);
?>
</pre>
|
Ausgabe
Array
(
[0] => www.atomicscript.de
[1] =>
[2] => www.atomicscript.de
)
|
Welche Elemente das Array kennt, ist abhängig von dem regulären Ausdruck. Im vorliegenden Beispiel enthält das Array insgesamt 3 Elemente:
. Im ersten Element $matches[0] ist immer die gesamte Zeichenkette gespeichert, die dem Ausdruck /^(http:\/\/)?([^\/]+)/i entspricht.
. Im zweiten Element $matches[1] befindet sich die Zeichenkette, die dem ersten Teil Ausdruck (http:\/\/) entspricht.
. Im dritten Element $matches[2] befindet sich die Zeichenkette, die em zweiten Teil Ausdruck ([^\/]+) entspricht.
Einsatz von preg_match_all()
Der Einsatz von preg_match() hat einen gravierenden Nachteil, nach dem ersten Auftreten wird die Verarbeitung abgebrochen. Sämtliche Fundstellen erhalten Sie daher lediglich, wenn Sie statt preg_match() die Funktion preg_match_all() einsetzen.
Beispiel
<pre>
<?php
// Zeichenkette
$urls = "<a href=www.berlin.de>Berlin</a>
<a href=www.bonn.de>Bonn</a>";
// Prüfen auf Tags
preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\2>)/", $urls, $matches);
print_r($matches);
?>
</pre>
|
Ausgabe
Array
(
[0] => Array
(
[0] => <a href=www.berlin.de>Berlin</a>
[1] => <a href=www.bonn.de>Bonn</a>
)
[1] => Array
(
[0] => <a href=www.berlin.de>
[1] => <a href=www.bonn.de>
)
[2] => Array
(
[0] => a
[1] => a
)
[3] => Array
(
[0] => Berlin
[1] => Bonn
)
[4] => Array
(
[0] => </a>
[1] => </a>
)
)
|
Die Zeichenkette enthält zwei HTML-Verweise und mit Hilfe von preg_match_all() wird im Array matches nicht nur eine Fundstelle gespeichert, sondern sämtliche Fundstellen. Es handelt sich um ein verschachteltes Array, welches die Verwaltung der einzelnen Fundstellen wesentlich erleichtert.
Besonderheit
Die Art der Gruppierung kann bei preg_match_all() beeinflusst werden. Mit Hilfe eines vierten Optionalen Parameters, können Sie die folgenden Konstanten übergeben:
. PREG_PATTERN_ORDER stellt die Standardeinstellung dar.
. PREG_SET_ORDER ändert die Reihenfolge so, dass in einem Element das Array $matches sämtliche Informationen zu einer Fundstelle gespeichert werden.
. PREG_OFFSET_CAPTURE sichert zusätzlich die Position der einzelnen Teilstrings.
Beispiel mit PREG_SET_ORDER
<pre>
<?php
// Zeichenkette
$urls = "<a href=www.berlin.de>Berlin</a>
<a href=www.bonn.de>Bonn</a>";
// Prüfen auf Tags
preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\2>)/", $urls, $matches, PREG_SET_ORDER);
print_r($matches);
?>
</pre>
|
Ausgabe
Array
(
[0] => Array
(
[0] => <a href=www.berlin.de>Berlin</a>
[1] => <a href=www.berlin.de>
[2] => a
[3] => Berlin
[4] => </a>
)
[1] => Array
(
[0] => <a href=www.bonn.de>Bonn</a>
[1] => <a href=www.bonn.de>
[2] => a
[3] => Bonn
[4] => </a>
)
)
|
Einsatz von preg_grep()
Natürlich steht Ihnen auch eine Funktion zum durchsuchen von Arrays zur Verfügung. Es handelt sich hierbei um die Funktion preg_grep().
Beispiel
<pre>
<?php
// Array
$urls = array(
"<a href=www.berlin.de>Berlin</a>",
"<a href=www.bonn.de>Bonn</a>"
);
// Prüfen auf Tags
$res = preg_grep("/(<([\w]+)[^>]*>)(.*)(<\/\2>)/", $urls);
print_r($res);
?>
</pre>
|
Ausgabe
Array
(
[0] => <a href=www.berlin.de>Berlin</a>
[1] => <a href=www.bonn.de>Bonn</a>
)
|
Einsatz von preg_replace()
Die Funktion preg_replace() eignet sich hervorragend um eine Zeichenfolge durch eine andere zu ersetzen. Auch in diesem Fall spielen die regulären Ausdrücke eine wesentliche Rolle, um diesen Austausch vorzunehmen. Die Funktion ersetzt sämtliche Vorkommen im String. Möchten Sie die Ersetzungen begrenzen, so können Sie als optionalen Parameter eine Integerzahl übergeben. Es werden nur so viele Ersetzungen durchgeführt wie angegeben.
Beispiel
<?php
// Zeichenkette
$url = "[url=www.berlin.de]";
// Suchmuster
$reg_muster = "/\[url=([^]]*)\]/i";
// Austausch
$tausch = '<a href=""></a>';
// Prüfen auf Tags
echo preg_replace($reg_muster, $tausch, $url);
?>
|
Ausgabe
<a href="www.berlin.de">www.berlin.de</a>
|
Diese spezielle Schreibweise [url=Verweis], für einen Verweis wird häufig in Online-Foren verwendet. Mit Hilfe des regulären Ausdrucks und der Funktion preg_replace() wurde im Hand umdrehen ein HTML-Verweise daraus erzeugt.
Besonderheit
Sie können auch mehre als eine Ersetzung gleichzeitig durchführen. Zu diesem Zweck übergeben Sie der Funktion ein indiziertes Array mit Suchmustern und ein Array mit Ersetzungen.
Beispiel
<pre>
<?php
// Zeichenkette
$eintrag = "[url=www.berlin.de]
[image=../bilder/smiley.gif]";
// Suchmuster
$reg_Liste = array(
"/\[url=([^]]*)\]/i",
"/\[image=([^]]*)\]/i"
);
// Austausch
$tauschListe = array(
'<a href=""></a>',
'<img src="" border="0" alt="">'
);
// Prüfen auf Tags
echo preg_replace($reg_Liste, $tauschListe, $eintrag);
?>
</pre>
|
Ausgabe
<a href="www.berlin.de">www.berlin.de</a>
<img src="../bilder/smiley.gif" border="0" alt="../bilder/smiley.gif">
|
Sie sollten es mal mit folgender Zeichenkette versuchen:
$eintrag = "Link: [url=www.berlin.de]<br>
Bild: [image=../bilder/smiley.gif]<br>
Bild: [image=../fotos/caro.gif]";
|
Bisher war in den Beispielen zu preg_replace() die Variable $eintrag immer vom Typ String. Sie können jedoch ohne weiteres auch ein Array übergeben. Die Ersetzung wird dann für jedes Element des Arrays durchgeführt.
Beispiel
<pre>
<?php
// Array
$eintrag = array(
"Link: [url=www.berlin.de]<br>",
"Bild: [image=../bilder/smiley.gif]<br>",
"Bild: [image=../fotos/caro.gif]"
);
// Suchmuster
$reg_Liste = array(
"/\[url=([^]]*)\]/i",
"/\[image=([^]]*)\]/i"
);
// Austausch
$tauschListe = array(
'<a href=""></a>',
'<img src="" border="0" alt="">'
);
// Prüfen auf Tags
$res = preg_replace($reg_Liste, $tauschListe, $eintrag);
// Ausgabe
foreach ($res as $element) {
echo $element;
}
?>
</pre>
|
Ausgabe
Link: <a href="www.berlin.de">www.berlin.de</a><br>
Bild: <img src="../bilder/smiley.gif" border="0" alt="../bilder/smiley.gif"><br>
Bild: <img src="../fotos/caro.gif" border="0" alt="../fotos/caro.gif">
|
Einsatz von preg_replace_callback()
Eine besondere Rolle bei der Ersetzung von Zeichenketten spielt die Funktion preg_replace_callback(). Die Funktion ruft eine callback-Funktion auf, die den zu ersetzenden String bildet. Der Rückgabewert der callback-Funktion bildet den zu ersetzenden String.
Beispiel
<pre>
<?php
// Zeichenkette
$eintrag = "Link: [url=javascript:alert(\'Test\')]<br>
[url=www.berlin.de]";
// Suchmuster
$reg_muster = "/\[url=([^]]*)\]/i";
// Callback-Funktion
function nojavascript($matches) {
if (!preg_match("/javascript:/i",$matches[0])) {
return '<a href="' . $matches[1] . '">' . $matches[1] . '</a>';
}
}
// Prüfen auf Tags
$res = preg_replace_callback($reg_muster, "nojavascript", $eintrag);
// Ausgabe
echo $res;
?>
</pre>
|
Ausgabe
Link: <br>
<a href="www.berlin.de">www.berlin.de</a>
|
In Beispiel werden sämtliche javascript: Verweise einfach ignoriert und lediglich ordnungsgemässe Verweise formatiert zurückgegeben. Dies ist in Online-Foren ein äusserst nützlicher Austausch, da sonst jeder einfach mal so einige JavaScript-Funktionen ausführen könnte.
Einsatz von preg_split()
Die Funktion preg_split() ist in der Lage eine Zeichenkette mit Hilfe eines regulären Ausdrucks zu zerlegen und gibt ein indiziertes Array, welches die Teilstrings als Array Elemente enthält zurück.
Sehr oft treffen wir auf Texte, in denen bestimmte Zeichen Teile eines Textes voneinander trennen. So ermöglichen, Tabellenkalkulationsprogramme, wie Excel den Export von Tabellen in Form von kommaseparierten Listen. Durch die Zerlegung des Strings ist es möglich, eine solche Liste in einem Array zu speichern und weiter zu verarbeiten. In den meisten Fällen wird der Einsatz der Stringfunktion explode() zum gewünschten Ergebnis führen. Diese Funktion zerlegt einen String anhand eines oder mehrerer Trennzeichen und gibt ein Array von Teilstrings zurück. Sind die Trennzeichen eindeutig festgelegt, sollten Sie diese Funktion verwenden, da diese nicht auf die Mechanismen der regulären Ausdrücke angewiesen ist. Dies wird jedoch nicht in jedem Fall möglich sein, wie das folgende Beispiel beweist:
<pre>
<?php
// Zeichenkette
$text = "Eintrag1,Eintrag2:Eintrag3 Eintrag4;Eintrag5";
// Suchmuster
$reg_muster = "/,|;|:| /";
print_r(preg_split($reg_muster,$text));
?>
</pre>
|
Ausgabe
Array
(
[0] => Eintrag1
[1] => Eintrag2
[2] => Eintrag3
[3] => Eintrag4
[4] => Eintrag5
)
|
Die Zeichenkette $text enthält Elemente, die durch ein Komma, ein Semikolon, ein Doppelpunkt oder ein Leerzeichen voneinander getrennt sind. Unabhängig vom Trennzeichen wird aus der Zeichenkette ein Array mit den einzelnen Elementen erzeugt.
Besonderheit
Der Funktion können Sie als vierten und optionalen Parameter flags übergeben. Dieser Parameter enthält Konstanten, mit denen Sie das Verhalten der Funktion steuern können.
. PREG_SPLIT_NO_EMPTY unterdrückt die Rückgabe von leeren Elementen.
. PREG_SPLIT_DELIM_CAPTURE berücksichtigt Klammern und gibt deren Fundstelle als Element mit zurück.
. PREG_SPLIT_OFFSET_CAPTURE gibt ein Array von Elementen zurück, deren Werte selbst wiederum Arrays darstellen. Das erste Element dieses Arrays ist der Teilstring, das zweite Element die reale Position des Teilstrings im Originalstring.
Beachten Sie, wenn Sie den Parameter flags verwenden, dass zwingend der optionale Parameter limit gesetzt werden muss. Möchten Sie, dass preg_split() sämtliche Teilstrings zurück gibt, so übergeben Sie als limit den Wert -1. Benötigen Sie den Parameter flags nicht, so brauchen Sie auch keinen Wert für limit anzugeben.
|
|
|
|
|
|
|
|