Я пытаюсь развернуть свой веб-сайт в Интернете, чтобы протестировать его в реальной среде. Это своего рода текстовый редактор, в котором пользователи могут использовать регулярные выражения и определяемые пользователем функции обратного вызова.
У меня проблема с функцией preg_replace_callback(). На моем хостинге версия PHP старше 5.3, и я не могу использовать анонимную функцию в своем коде (у меня PHP 5.4 на локальном хосте). Поэтому я должен переписать эту часть кода (которая корректно работает на локальном хосте)
$newString = preg_replace_callback(
'#' . $this->pattern . '#' . $this->modifiers,
function($match)
{
return eval('return ' . $this->replacement . ';');
},
$string);
На данный момент я не говорю об опасностях использования eval() - этой проблеме будет уделено должное внимание чуть позже ("проверка списка запрещенных слов" и т.д.). Проблема в том, что моя попытка ниже
$replacement = $this->replacement;
$newString = preg_replace_callback(
'#' . $this->pattern . '#' . $this->modifiers,
create_function('$match', '
global $replacement;
return eval(\'return \' . $replacement . \';\');
'),
$string);
не работает и ошибок не возникает. Что не так с моим кодом?
Любая помощь приветствуется.
Новая информация. я пробовал это
Class A
{
public function check()
{
$string = 'series 3-4';
$pattern = 'series[ ]*(\d+)[ ]*-[ ]*(\d+)';
$modifiers = 'um';
$replacement = '$match[2] == $match[1] + 1 ? "series $match[1] and $match[2]" : "series $match[1]-$match[2]"';
$newString = preg_replace_callback(
'#' . $pattern . '#' . $modifiers,
create_function('$match', '
global $replacement;
echo $replacement;
return eval(\'return \' . $replacement . \';\');
'),
$string);
echo $newString;
}
}
$a = new A;
$a->check();//get nothing
и обнаружил, что $replacement внутри create_function() пуст. Но когда я использую ту же функцию create_function() вне класса, $replacement не пуст:
$string = 'series 3-4';
$pattern = 'series[ ]*(\d+)[ ]*-[ ]*(\d+)';
$modifiers = 'um';
$replacement = '$match[2] == $match[1] + 1 ? "series $match[1] and $match[2]" : "series $match[1]-$match[2]"';
$newString = preg_replace_callback(
'#' . $pattern . '#' . $modifiers,
create_function('$match', '
global $replacement;
echo $replacement . "<br/>";
return eval(\'return \' . $replacement . \';\');
'),
$string);
echo $newString;
//$match[2] == $match[1] + 1 ? "series $match[1] and $match[2]" : "series $match[1]-$match[2]"
//series 3 and 4