Als je in jouw PHP-code gebruik maakt van preg_replace() met /e pattern modifier:

In PHP 5.5 is een onderdeel van de preg_replace()-functie niet meer beschikbaar. Het gaat om de /e-switch, waarmee opdrachten uitgevoerd kunnen worden. Op basis van gevonden zoekresultaten kan een commando of een functie uitgevoerd worden. Door het uitvoeren van opdrachten kan in sommige gevallen ook malafide code worden uitgevoerd. Dit maakt dit gedeelte van de functie gevoelig voor misbruik.

Tot en met PHP 5.4 kan het volgende commando gegeven worden:

$tekst = preg_replace("reguliere expressie/ie", "functie('$1')", $tekst);

Hier wordt een bestaande variabele met de naam $tekst gepakt en gecontroleerd door middel van een reguliere expressie. Als er één of meer zoekresultaten zijn die aan de voorwaarden voldoen worden die naar een functie met de naam functie() gestuurd. De return-value wordt weer gebruikt als vervanging van het zoekresultaat in de waarde van de variabele $tekst.

Door de pattern modifier /i wordt de zoekopdracht ongevoelig voor hoofd- en kleine letters.

Bijvoorbeeld
Met de code hieronder word er in de variabele $tekst gezocht naar de term [URL]http://website.nl[/URL].

Als deze wordt gevonden dan wordt eerst [URL] en [/URL] verwijderd. Hetgeen dat overblijft wordt doorgestuurd naar de functie genaamd stripurl().

$tekst = preg_replace("/\[URL\](.+?)\[\/URL\]/ie", "stripurl('$1')", $tekst);

Sinds PHP 5.5 zal het gebruik van preg_replace() /e een deprecated-melding geven. Dit betekent dat het een nog wel ondersteunde opdracht is, maar het gebruik sterk afgeraden wordt. In een volgende versie van PHP zal de /e modifier van de functie uitgeschakeld worden. Als vervangende functie wordt preg_replace_callback() aangeraden. Hiermee is ongeveer hetzelfde mogelijk, maar de syntaxis is wat anders:

$tekst = preg_replace_callback("reguliere expressie/i", function($var) { return functie($var[1]); }, $tekst);

Hier wordt een bestaande variabele met de naam $tekst gepakt en gecontroleerd door middel van een reguliere expressie. Als er één of meer zoekresultaten zijn, worden die naar een functie met de naam functie() gestuurd. De return-value wordt weer gebruikt als vervanging van het zoekresultaat. Om de functie staan accolades. Dat komt omdat het aanroepen van de functie eigenlijk binnen een andere functie gebeurt.
Voorbeeld:

$tekst = preg_replace_callback("/\[URL\](.+?)\[\/URL\]/i", function($var) { return stripurl($var[1]); }, $tekst);

Ter illustratie is hier de inhoud van de functie stripurl(). Deze functie heeft een URL als invoer, en kijkt of die gevuld is, of hij de tekst :// bevat en of het protocol http, https en ftp is. Als de URL aan al deze voorwaarden voldoet, wordt hij aanklikbaar en anders wordt er een foutmelding in vette tekst retour gegeven.


function stripurl($url)
{
  $url = trim($url);
  if (strlen($url) == 0)
  {
    $url = "<b>Ongeldige url</b>";
  }
  if (strlen($url) > 0)
  {
    $gesplitst = explode("://",$url);
    if (count($gesplitst) <> 2)
    {
      $url = "<b>Ongeldige url</b>";
    }
    if (count($gesplitst) == 2)
    {
      $protocol = strtolower(trim($gesplitst[0]));
      if ($protocol == "http" || $protocol == "https" || $protocol == "ftp")
      {
        $url = "<a href=\"" . $url . "\" target=\"_blank\">" . $url . "</a>";
      }
      else
      {
        $url = "<b>Ongeldig protocol en dus een ongeldige url</b>";
      }
    }
  }

  return $url;
}

Meer informatie over preg_replace() en preg_replace_callback(): http://php.net/manual/en/function.preg-replace.php, http://php.net/manual/en/function.preg-replace-callback.php

Wat vond je van dit antwoord?

Bedankt voor je feedback!

Er is een fout opgetreden. Probeer het later opnieuw.