Teil von  SELFPHP   Teil von  Praxisbuch  Teil von  Reguläre Ausdrücke
Letztes Update: 16.08.2005 17:53:45


Navigation

Seite News *

Seite Startseite
Seite Über SELFPHP
Seite Werbung
Seite Kontakt
Seite Forum *
Seite Download *
Seite SELFPHP Banner *
Seite SELFPHP in Buchform
Seite Newsletter *
Seite Impressum

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  

 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 79.000 Beiträgen finden Sie sicher die passende Antwort!  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 



 

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$matchesPREG_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.


 


Hinweise zur Optimierung
 




 sponsored by

Host Europe


HighText iBusiness


Host Europe




© 2001-2006 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt
© 2005-2006 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de