preload
Jul 11

Gelegentlich kommt es vor, dass man eine mit PHP erzeugte HTML-Ausgabe vor der Ausgabe noch modifizieren möchte. Bspw. sollen alle src-Attribute in img-Tags geändert werden. Soll gleichzeitig noch jede Ersetzung anhand bestimmter Kriterien oder mit wechselnden Optionen durchgeführt werden, kommt idealerweise ein Callback einer Funktion oder einer Methode zum Einsatz. Wenn zum Finden der gewünschten Inhalte ein regulärer Ausdruck verwendet werden kann bzw. soll, ist preg_replace_callback die richtige Wahl.

Dieser Artikel beschreibt anhand eines Beispiels, wie mittels preg_replace_callback innerhalb einer Methode alle src-Attribute von img-Tags gefunden und über ein Callback einer Methode der selben Klasse ersetzt werden können.

Bilder von gespiegelten Servern lesen

Angenommen wird, dass die src-Attribute relative Angaben bezogen auf das htdocs-Root-Verzeichnis enthalten. Die Server, von denen die Bilder geladen werden, werden als Array definiert und später durchlaufen. Zunächst müssen über den passenden regulären Ausdruck die Bilder gefunden werden:

#<img([^><]+)src="([^"]+)"#i

Der Delimiter ist #, wir arbeiten case-insensitive (i am Ende) und suchen nach allem, was mit <img beginnt, gefolgt von beliebigen Kominationen von allem außer < order > gefolgt von src=" gefolgt von allem außer " bis zum nächsten ".

Jeder einzelne Fund wird von preg_replace_callback als Array an die Callback-Funktion bzw. -Methode übergeben. Dient eine Funktion als Callback, wird der Funktionsname als String übergeben, wird eine Methode auf einem Objekt aufgerufen, wird ein Array mit dem Objekt und dem Methodenname als String übergeben.

In unserem Fall enthält der reguläre Ausdruck zwei variable Teile. Das Array, das an das Callback übergeben wird, enthält an Position 0 den durch den regulären Ausdruck gefundenen String, an allen weiteren Positionen den n-ten gefundenen variablen Teil. Das Callback liefert an preg_replace_callback den String, mit dem der gefundene Bereich ersetzt werden soll. Sind irgendwelche Voraussetzungen nicht erfüllt, ist das der gefundene Original-String. Ansonsten wird mit Hilfe der gefundenen variablen Teile des regulären Ausdrucks und neu hinzugefügten Teilen der Ersetzungs-String generiert. In diesem Beispiel wird alles so zusammengesetzt, wie es vorher war, mit der Ausnahme, dass nach src=" direkt eine andere Domain eingefügt wird, um die Bilder abwechselnd von anderen Servern zu laden.

Eine kleine ungetestete Demo hierzu sieht wie folgt aus:

<?php

class clsPregReplaceCallbackDemo {
  
  var $iDomain = 0;
  var $aImageCDN = array("sub1.yourcdn.com", "sub2.yourcdn.com", ...);
  
  function getModifiedImageTag($aParam) {
    
    if (!is_array($this->aImageCDN) ||
        count($this->aImageCDN) == 0 ||
        !isset($this->aImageCDN[$this->iDomain])) return $aParam[0];
    
    $sNewSrc = "http://" . $this->aImageCDN[$this->iDomaim] . "/" . $aParam[2];
  
    $sReplacement = 'aImageCDN[++$this->iDomain])) $this->iDomain = 0;
    
    return $sReplacement;
  
  }
  
  function modifyImgTagSrcAttributes(&$sContent) {
    
    $sRegExp = '#]+)src="([^"]+)"#i';
    $aCallback = array($this, "getModifiedImageTag");
    
    $sContent = preg_replace_callback($sRegExp, $sCallback, $sContent);
    
  }
  
}

$sContent = getSomeContent(); // :-) 

$demo = new clsPregReplaceCallbackDemo();
$demo->modifyImgTagSrcAttributes($sContent);

echo $sContent;

?>

Gerne können Sie uns einen Kommentar hinterlassen oder auch Links zu Seiten, die sich mit regulären Ausdrücken beschäftigen.

4 Responses to “HTML-Attribute mit preg_replace_callback ersetzen”

  1. http://test.com/ Says:

    Thank you, I have just bsen looking for info approximately this subject for
    ages and yours iss the best I have found out till now.
    But, what concerning the conclusion? Are you positive in regards to the supply?

  2. bit.ly Says:

    Venture into the strategy and positiuve if you see adjustments in your
    business. Store mqterial that you use for building between flor joists orr ceiling rafters.

  3. Modesto Says:

    A newsletter is often a powerful weapon within your marketing arsenal.
    You nerd to pay attention at smaller details if you want
    to gain better profits. These charged subjects probably
    do not have placce insiide yur realm of blogging or writing.

  4. Hermelinda Says:

    The fact is, tend to be incredible opportunities for authors to sell lots
    of books. Kate has long been known as a hard-lined individual, who insists on having things her way, or no way.
    Don’t die with music still in buyers.

Leave a Reply