2014-10-14 2 views
0

мне нужно преобразовать preg_replace() в preg_replace_callback() в этой функции устаревшего расширения CMS:Преобразование функции из preg_replace в preg_replace_callback()

// santizes a regex pattern 
private static function sanitize($pattern, $m = false, $e = false) { 
    if(preg_match('/^\/(.*)([^\\\\])\/(.*?)$/', $pattern, $matches)) { 
     $pat = preg_replace(
      '/([^\\\\])?\(\?(.*\:)?(.*)\)/Ue', 
      '\'$1(?\' . self::cleanupInternal(\'$2\') . \'$3)\'', 
      $matches[1] . $matches[2] 
     ); 
     $ret = '/' . $pat . '/'; 
     if($m) { 
      $mod = ''; 
      foreach(self::$modifiers as $val) { 
       if(strpos($matches[3], $val) !== false) { 
        $mod .= $val; 
       } 
      } 
      if(!$e) { 
       $mod = str_replace('e', '', $mod); 
      } 
      $ret .= $mod; 
     } 
    } else { 
     $pat = preg_replace(
      '/([^\\\\])?\(\?(.*\:)?(.*)\)/Ue', 
      '\'$1(?\' . self::cleanupInternal(\'$2\') . \'$3)\'', 
      $pattern 
     ); 
     $pat = preg_replace('!([^\\\\])/!', '$1\\/', $pat); 
     $ret = '/' . $pat . '/'; 
    } 
    return $ret; 
} 

Я могу только представить себе, что делает эта функция. Я пробовал это, но он не работал:

private static function sanitize($pattern, $m = false, $e = false) { 
    if(preg_match('/^\/(.*)([^\\\\])\/(.*?)$/', $pattern, $matches)) { 
     $pat = preg_replace_callback(
      '/([^\\\\])?\(\?(.*\:)?(.*)\)/U', 
      function($matches) {return CallFunction('\'$1(?\' . self::cleanupInternal(\'$2\') . \'$3)\''); }, 
      $matches[1] . $matches[2] 
     ); 
     $ret = '/' . $pat . '/'; 
     if($m) { 
      $mod = ''; 
      foreach(self::$modifiers as $val) { 
       if(strpos($matches[3], $val) !== false) { 
        $mod .= $val; 
       } 
      } 
      if(!$e) { 
       $mod = str_replace('e', '', $mod); 
      } 
      $ret .= $mod; 
     } 
    } else { 
     $pat = preg_replace_callback(
      '/([^\\\\])?\(\?(.*\:)?(.*)\)/U', 
     function($matches) {return CallFunction('\'$1(?\' . self::cleanupInternal(\'$2\') . \'$3)\''); }, 
      $pattern 
     ); 
     $pat = preg_replace('!([^\\\\])/!', '$1\\/', $pat); 
     $ret = '/' . $pat . '/'; 
    } 
    return $ret; 
} 

Может ли кто-нибудь помочь мне в этом?

+0

Что должен делать этот код? –

+0

Почему вы пытаетесь обернуть результаты в 'CallFunction'? Вы можете просто преобразовать строки в фактические вызовы функций и любые '$ 1' в' $ matches [N] 'concats. – mario

+0

Я нашел 'function ($ matches) {return CallFunction (...); } 'as convert solution, и он работал в других заменах, которые я сделал. – Martin

ответ

1

Без убежденности, вы можете попробовать это в первый preg_replace и изменять второй preg_replace в таким же образом:

$that = $this; 
$pat = preg_replace_callback(
      '/([^\\\\])?\(\?(.*:)?(.*)\)/U', 
      function ($m) use ($that) { 
       return $m[1] . '(?' . $that->cleanupInternal($m[2]) . $m[3]; 
      }, 
      $matches[1] . $matches[2] 
); 

Как в стороне комментарии, я не думаю, что ([^\\\\])? имеет никакого смысла или полезен для чего-то, поскольку он является необязательным и повторно используется в заменяющей строке в том же положении.

+0

Спасибо, это просто отлично и не вызывает больше ошибок. – Martin

+0

@Martin: попробуйте это, прежде чем принять этот ответ. Больше никаких ошибок не означает, что ваша функция выполняет ту же работу. –

+0

Вы правы. Я вернул его. Спасибо, что! – Martin

Смежные вопросы