调用函数作为 preg_replace() 的替换参数

发布于 2024-12-05 07:45:37 字数 396 浏览 1 评论 0原文

我有一个复杂的问题: 我有一个很长的文本,我需要在文本中调用一些 php 函数。 函数名称是 myfunction(); 我们通过以下方式在文本中包含该函数: " text text text myfunction[1,2,3,4,5]; more text text ... "

我想用函数 myfunction 的结果替换每个 myfunction[...] 以及 [] 中的变量括号。

我的代码是:

<?php echo preg_replace('/myfunction[[0-9,]+]/i',myfunction($1),$post['content']); ?>

,但它不起作用。

该参数应该是一个数组,因为它可以包含任意数量的值。

I have a complicated problem:
I have a very long text and I need to call some php functions inside my text.
The function name is myfunction();
I`we included in my text the function in the following way:
" text text text myfunction[1,2,3,4,5]; more text text ... "

And I want to replace each myfunction[...] with the result of the function myfunction with the variables from the [] brackets.

my code is:

<?php echo preg_replace('/myfunction[[0-9,]+]/i',myfunction($1),$post['content']); ?>

,but it`s not working.

The parameter should be an array, because it can contain any number of values.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清醇 2024-12-12 07:45:37

如果我是您,我会避免使用 e 修饰符来 preg_replace,因为它可能导致您执行任意代码。请改用 preg_replace_callback。它稍微冗长一些,但更有效:

echo preg_replace_callback('/myfunction\[([0-9,]+)\]/i', function($matches) {
    $args = explode(',', $matches[1]); // separate the arguments
    return call_user_func_array('myfunction', $args); // pass the arguments to myfunction
}, $post['content']);

这使用了匿名函数。如果您使用 5.3 之前的 PHP 版本,则此功能将无法使用。您必须创建一个命名函数并按照手册页上的说明使用它。

If I were you, I would avoid using the e modifier to preg_replace because it can lead you open to execution of arbitrary code. Use preg_replace_callback instead. It's slightly more verbose, but much more effective:

echo preg_replace_callback('/myfunction\[([0-9,]+)\]/i', function($matches) {
    $args = explode(',', $matches[1]); // separate the arguments
    return call_user_func_array('myfunction', $args); // pass the arguments to myfunction
}, $post['content']);

This uses an anonymous function. This functionality won't be available to you if you use a version of PHP before 5.3. You'll have to create a named function and use that instead, as per the instructions on the manual page.

凑诗 2024-12-12 07:45:37

您可以使用 preg_replace() 的“e”修饰符(用于 EVAL),如下所示:

$text = preg_replace('/myfunction\[(.*?)\]/e', 'myfunction("$1")', $text);

我并没有真正了解您的数据的结构,所以目前我能做的就是帮助您。您可以探索该解决方案。

来自 PHP 手册

e (PREG_REPLACE_EVAL)
如果设置了此修饰符,则 preg_replace() 对替换字符串中的反向引用进行正常替换,将其计算为 PHP 代码,并使用结果替换搜索字符串。单引号、双引号、反斜杠 () 和 NULL 字符将在替换反向引用中通过反斜杠转义。

You can use preg_replace()'s "e" modifier (for EVAL) used like this :

$text = preg_replace('/myfunction\[(.*?)\]/e', 'myfunction("$1")', $text);

I didn't really get how your data is structured so it's all I can do to help you at the moment. You can explore that solution.

From the PHP Manual :

e (PREG_REPLACE_EVAL)
If this modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, evaluates it as PHP code, and uses the result for replacing the search string. Single quotes, double quotes, backslashes () and NULL chars will be escaped by backslashes in substituted backreferences.

纸短情长 2024-12-12 07:45:37

您需要在正则表达式中添加“e”修饰符、转义 [] 并将第二个参数字符串化。

preg_replace('/myfunction\[[0-9,]+\]/ei','myfunction("$1")',$post['content']);

You need to add the "e" modifier, escape [ and ] in the regex expression and stringify the second argument.

preg_replace('/myfunction\[[0-9,]+\]/ei','myfunction("$1")',$post['content']);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文