PHP Dynamic Regexp замена - PullRequest
       8

PHP Dynamic Regexp замена

1 голос
/ 25 августа 2011

Я хотел бы знать, есть ли способ связать функцию PHP внутри регулярного выражения.

Пример:

$path_str = '/basket.php?nocache={rand(0,10000)}';
$pattern = ? // something i have no idea
$replacement = ? // something i have no idea

$path = preg_replace($pattern, $replacement, $path_str);

Тогда:

echo "'$path'";

будетпроизводить что-то вроде

'/basket.php?nocache=123'

Выражение, не ограниченное функцией 'rand', будет еще более ценно.

Спасибо

Ответы [ 3 ]

1 голос
/ 25 августа 2011

Не храните логику PHP в строке. В конечном итоге вам придется использовать eval(), и если ваш сервер не застрелит вас за это, ваши коллеги будут.

В любом случае, до дела.

Ваш случай довольно прост, когда вам нужно добавить значение в конец строки. Примерно так было бы достаточно

$stored = '/basket.php?nocache=';
$path   = $stored . rand(0,10000);

Если, однако, вам нужно поместить значение где-то посередине строки или, возможно, в переменную, вы можете взглянуть на sprintf()

$stored = '/basket.php?nocache=%d&foo=bar';
$path   = sprintf($stored, rand(0,10000));
1 голос
/ 25 августа 2011

Вы можете сделать следующее.Уберите материал между {}, а затем запустите eval и установите его в переменную.Затем используйте новую переменную.Пример:

$str = "/basket.php?nocache={rand(0,10000)}";
$thing = "rand(0,10000)";
eval("\$test = $thing;");
echo $test;

$ - это то, что находится в {}, которое может дать вам простой подстрок.$ test the становится значением выполнения $ thing.Когда вы получаете эхо-тест, вы получаете случайное число.

0 голосов
/ 25 августа 2011

Я бы не пытался хранить функции в базе данных.Скорее сохраните какое-то поле, которое представляет тип функции для использования в каждом конкретном случае.

Затем внутри вашего crontab вы можете сделать что-то вроде:

switch ($function)
{
    case 'rand':
    $path_str = '/basket.php?nocache='. rand(0,10000);
}

и т. Д.

...