Проблемма с create_function

Тема в разделе "Как сделать...", создана пользователем Ramazan, 22 янв 2009.

Статус темы:
Закрыта.
  1. Ramazan

    Ramazan пыщ-пыщ

    Регистр.:
    28 янв 2007
    Сообщения:
    471
    Симпатии:
    98
    вообщем есть код
    PHP:
    $Find    '\$[a-z_][a-z_0-9]*(?:\[(?:(?:\'[a-z_0-9]+\')|(?:"[a-z_0-9]+")|(?:[0-9]+))\])*';
    $Replace '';
    foreach (
    $Vars as $Key => $Value)
    {
        
    $Value str_replace("'"'\\\''$Value);
        if(
    preg_match("/$Find/i"'$' $Key))
        {
            
    $Replace .= "\n$$Key = '$Value';";
        }
    }
    $Func   create_function('$Arg''' $Replace 'return eval("return $Arg[1];");');
    $Values preg_replace_callback("/\{($Find)\}/i"$Func$Values);
    Этот код текст в котором имеем примерно следующее
    t1 = 'foo';
    t2 = {$t1} test
    получаем из echo $t2 foo test,
    НО У МЕНЯ ВЫЛАЗИЕТ ОШИБКА

    Код:
    Parse error: syntax error, unexpected T_STRING in Z:\home\test\www\index.php(87) : runtime-created function on line 3
    
    Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '', to be a valid callback in Z:\home\test\www\index.php on line 88
    
    Parse error: syntax error, unexpected T_STRING in Z:\home\test\www\index.php(87) : runtime-created function on line 3
    
    Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '', to be a valid callback in Z:\home\test\www\index.php on line 88
    Голова уже кипит, хотя уверен что проблемма легко решаема
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Проблема в чём?
     
  3. Ramazan

    Ramazan пыщ-пыщ

    Регистр.:
    28 янв 2007
    Сообщения:
    471
    Симпатии:
    98
    проблемма начинается тут:
    $Func = create_function('$Arg', '' . $Replace . 'return eval("return $Arg[1];");');
    после чего вылазиет ошибка
    $Values = preg_replace_callback("/\{($Find)\}/i", $Func, $Values);
    В итоге
    t1 = 'foo';
    t2 = {$t1} test
    не парситься и на выходе даёт
    PHP:
    echo $t2 // получаем {$t1} test
    а должно быть
    PHP:
    echo $t2 // получаем foo test
     
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Не понял - проблема с create_function или с {$t1} test?
    Опиши нормально, а то сумбур какой-то у тебя.
     
  5. Ramazan

    Ramazan пыщ-пыщ

    Регистр.:
    28 янв 2007
    Сообщения:
    471
    Симпатии:
    98
    1. получаем $Vars = array("t1" => 'foo', "t2" => '{$t1} test');
    2. Меняем внешний вид:
    PHP:
    foreach ($Vars as $Key => $Value)
    {
        
    $Value str_replace("'"'\\\''$Value);
        if(
    preg_match("/$Find/i"'$' $Key))
        {
            
    $Replace .= "\n$$Key = '$Value';";
        }
    }
    3. Получаем $Replace равное $t1 = 'foo' и $t2 = {$t1} test
    4. Передаём значение $Replace в
    PHP:
    $Func create_function('$Arg''' $Replace 'return eval("return $Arg[1];");');
    5. При вызове $Func в preg_replace_callback, $Func выдаёт ошибку
    Parse error: syntax error, unexpected T_STRING in Z:\home\test\www\index.php(87) : runtime-created function on line 3
    В следствии чего не может нормально сработать preg_replace_callback, и выдаёт ошибку
    Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '', to be a valid callback in Z:\home\test\www\index.php on line 88

    Вот насчёт объяснений, с этим у меня сложно :ah:

    Короче мне кажется дело в create_function
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    На первый взгляд:
    1. Возможно $Replace не видна в твоей функции.
    2. Зачем писать лямбда-функцию, если её можно оформить как обычную и вызвать в preg_replace_callback? Это я к тому, что обыкновенную функцию легче отдебажить, а потом её можно перевести в лямбда-функцию если есть необходимость.
     
    Ramazan нравится это.
  7. Ramazan

    Ramazan пыщ-пыщ

    Регистр.:
    28 янв 2007
    Сообщения:
    471
    Симпатии:
    98
    Разобрался, ошибка была в значении $Replace, там слэш обратный перед апострофом стоял.
     
Статус темы:
Закрыта.