Вопрос по preg-replace-callback, php, preg-replace, create-function, global-variables – PHP: Как сделать переменную видимой в create_function ()?

0

Этот код:

<code>$t = 100;
$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
                            create_function(
                                  '$matches',
                                  'return $matches[1] + $t;'
                            ), $func);
</code>

Как сделать $ t видимым из create_function () в функции preg_replace ()?

Вы должны использовать замыкания вместоphp.net/functions.anonymous function($matchtes)use($t){/*..*/} KingCrunch
Решение зависит от того, какую версию PHP вы используете. В идеале решение состоит в том, чтобы использовать замыкание, передавая переменную $ t вuse построить. Для этого требуется как минимум PHP 5.3. Кстати, если значение $ t не соответствует каждому изменению, вы можете рассмотреть возможность использования константы, которая будет доступна в любом контексте. Wil Moore III
@hakre"1" + 100 ;) Но я понимаю, что вы имеете в виду: регулярное выражение соответствует чему-то, начиная сNameтаким образом, функция всегда будет возвращать100 (=$t). Наверное, не хотел. KingCrunch
Хм + операция на струнах? hakre

Ваш Ответ

5   ответов
3

анонимная функция будет работать, используя при этомuse синтаксис:

$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
    function($matches) use($t) // $t will now be visible inside of the function
    {
        return $matches[1] + $t;
    }, $func);
0

any Функция увидеть глобальную переменную.

$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
                            create_function(
                                  '$matches',
                                  'global $t; return $matches[1] + $t;'
                            ), $func);
2

но в вашем случае вы можете просто использовать значение:

$t = 100;
$str = preg_replace_callback("/(Name[A-Z]+[0-9]*)/",
                            create_function(
                                  '$matches',
                                  'return $matches[1] + ' . $t .';'
                            ), $func);

Тем не менее, этоhighly Рекомендуется использоватьfunction($matches) use ($t) {} Синтаксис здесь (http://php.net/functions.anonymous).

И есть модификатор Eval дляpreg_replace:

$str = preg_replace("/(Name[A-Z]+[0-9]*)/e", '$1+'.$t, $func);

Но у меня такое ощущение, что ваша функция в любом случае использует неправильный оператор - или неправильный шаблон / подшаблон.

Вы - гений!
0

use  или жеglobal в использовании create_functionglobal

function() use($var1,$var2...etc){code here}

или же

create_func($args,'global $var1,$var2;code here;');

Осторожно!global импортирует только переменные из глобальной области видимости, а не из области, в которой определена функция, напримерuse делает.
0

Ты можешь использовать$GLOBALS но это не очень рекомендуется ...

$str = preg_replace_callback ( "/(Name[A-Z]+[0-9]*)/", create_function ( '$matches', 'return $matches[1] + $GLOBALS["t"];' ), $func );

Лучшее решение

http://php.net/functions.anonymous анонимная функция .. если вы не хотите использовать то, что вы также можете сделатьarray_walk ( http://php.net/manual/en/function.array-walk.php ) после того, как вы получили результат в формате массива, передайте$t как правильный аргумент функции

Похожие вопросы