Skip to content

Instantly share code, notes, and snippets.

@BastienClement
Last active January 16, 2016 16:21
Show Gist options
  • Save BastienClement/61f001071bb8e640a917 to your computer and use it in GitHub Desktop.
Save BastienClement/61f001071bb8e640a917 to your computer and use it in GitHub Desktop.

Revisions

  1. Bastien Clément revised this gist Jan 16, 2016. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions preg_replace_safe.php
    Original file line number Diff line number Diff line change
    @@ -26,13 +26,13 @@ function preg_replace_safe($search, $replace, $subject, $evaluator = NULL) {
    if (is_callable($r)) {
    $subject = preg_replace_callback($s, $r, $subject);
    } else {
    $stripped = preg_replace("/^(.)(.*\\1[a-z]*)e([a-z]*)$/si", "$1$2$3", $s);
    $stripped = preg_replace('/^(.)(.*\\1[a-z]*)e([a-z]*)$/si', "$1$2$3", $s);
    if ($stripped != $s) {
    $subject = preg_replace_callback($stripped, function($matches) use ($r, $evaluator) {
    $code = preg_replace_callback("/\\$(?|\{(\\d+)\}|(\\d+))/", function($m) use ($matches) {
    $code = preg_replace_callback('/\\$(?|\{(\\d+)\}|(\\d+))/', function($m) use ($matches) {
    return addslashes($matches[(int) $m[1]]);
    }, $r);
    return $evaluator("return " . $code . ";");
    return $evaluator('return ' . $code . ';');
    }, $subject);
    } else {
    $subject = preg_replace($s, $r, $subject);
  2. Bastien Clément revised this gist Jan 16, 2016. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions preg_replace_safe.php
    Original file line number Diff line number Diff line change
    @@ -2,6 +2,9 @@

    function preg_replace_safe($search, $replace, $subject, $evaluator = NULL) {
    if (is_null($evaluator)) {
    // A custom evaluator
    // function($c) { return eval($c); }
    // is required if the replacement code uses the $this reference.
    $evaluator = function($code) { return eval($code); };
    }

  3. Bastien Clément revised this gist Jan 16, 2016. No changes.
  4. Bastien Clément revised this gist Jan 16, 2016. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions preg_replace_safe.php
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,5 @@
    <?php

    function preg_replace_safe($search, $replace, $subject, $evaluator = NULL) {
    if (is_null($evaluator)) {
    $evaluator = function($code) { return eval($code); };
  5. Bastien Clément created this gist Jan 16, 2016.
    40 changes: 40 additions & 0 deletions preg_replace_safe.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,40 @@
    function preg_replace_safe($search, $replace, $subject, $evaluator = NULL) {
    if (is_null($evaluator)) {
    $evaluator = function($code) { return eval($code); };
    }

    if (is_array($subject)) {
    return array_map(function($subject) use ($search, $replace) {
    return preg_replace_safe($search, $replace, $subject);
    }, $subject);
    } else {
    if (is_array($search) && is_array($replace)) {
    $replacements = array_map(function($a, $b) { return [$a, $b]; }, $search, $replace);
    } else if(is_array($search)) {
    $replacements = array_map(function($a) use($replace) { return [$a, $replace]; }, $search);
    } else {
    $replacements = [[$search, $replace]];
    }

    foreach ($replacements as $replacement) {
    list ($s, $r) = $replacement;
    if (is_callable($r)) {
    $subject = preg_replace_callback($s, $r, $subject);
    } else {
    $stripped = preg_replace("/^(.)(.*\\1[a-z]*)e([a-z]*)$/si", "$1$2$3", $s);
    if ($stripped != $s) {
    $subject = preg_replace_callback($stripped, function($matches) use ($r, $evaluator) {
    $code = preg_replace_callback("/\\$(?|\{(\\d+)\}|(\\d+))/", function($m) use ($matches) {
    return addslashes($matches[(int) $m[1]]);
    }, $r);
    return $evaluator("return " . $code . ";");
    }, $subject);
    } else {
    $subject = preg_replace($s, $r, $subject);
    }
    }
    }

    return $subject;
    }
    }