【问题标题】:PHP Dynamic Regexp replacementPHP 动态正则表达式替换
【发布时间】:2011-08-24 21:10:56
【问题描述】:

我想知道是否有办法在正则表达式中绑定 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' 函数的表达式会更受欢迎。

谢谢

【问题讨论】:

  • 您为什么还要考虑使用正则表达式?只需回显 "/basket.php?nocache=" 。兰德(0,10000);
  • 因为“path_str”将存储在数据库中,但在稍后执行 cron 作业时,我想处理 path_str
  • 好的,我找到了我需要的东西:preg_replace_callback 函数
  • 在数据库中存储函数名称?可怕,绝对可怕,令人作呕。您应该立即停止所有操作并返回绘图板。
  • 你错了,将任何逻辑离合器存储在 db 或其他地方没有什么可怕的。您如何能够在多种语言之间共享一些代码。对我来说很简单:协议+(语言+解释器)

标签: php regex dynamic replace


【解决方案1】:

您可以执行以下操作。去掉 {} 之间的内容,然后对其运行 eval 并将其设置为变量。然后使用新变量。例如:

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

$thing 将是 {} 中的内容,一个简单的 substr 可以为您提供。 $test 成为执行 $thing 的值。当你回显测试时,你会得到一个随机数。

【讨论】:

  • @joey:我不喜欢 eval,但这个解决方案可能是我在这里看到的更简单的解决方案。
  • @graydot:解释一下。在什么情况下 eval 会变得危险。请不要只是重复您听说过的有关 eval 的内容,而是告诉我们您使用此功能的个人爱情故事。
  • @Keil 看看this question,它是accepted answer。它并没有简单地说明eval 绝对可怕,而是说明在大多数情况下,eval 绝对不是答案。
【解决方案2】:

无论您做什么,都不要将 PHP 逻辑存储在字符串中。你最终将不得不使用eval(),如果你的服务器不为它开枪,你的同事会。

Anywhoo,言归正传。

您的情况相当简单,您需要在字符串末尾附加一个值。这样的事情就足够了

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

但是,如果您需要在字符串中间的某处放置一个值,或者可能在一个变量位置,您可以查看sprintf()

$stored = '/basket.php?nocache=%d&foo=bar';
$path   = sprintf($stored, rand(0,10000));

【讨论】:

  • 我的情况不简单。你只是认为它是,这就是为什么你给我一个选择。这不是我问的。不过还是谢谢
【解决方案3】:

我不会尝试将函数存储在数据库中。而是存储某种类型的字段来表示用于每个特定情况的函数类型。

然后在您的 crontab 中,您可以执行以下操作:

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

e.t.c

【讨论】:

  • 对不起,我没有要求替代品。
猜你喜欢
  • 2013-12-09
  • 2011-02-21
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2020-07-14
  • 2018-03-21
  • 1970-01-01
相关资源
最近更新 更多