php 字符串中调用函数调用函数,在PHP中,如何调用字符串中的函数?

说,字符串是:

$str="abcdefg foo() hijklmopqrst";

如何让php调用foo()并将返回字符串插入该字符串?

非常不愉快。您是否有一个允许此操作的函数列表,或者一般的函数列表?(同样,您也考虑了这一点对安全性和性能的影响,是吗?)

您可以使用eval(),但并不是广泛推荐的。

请给我们更多关于您的代码的信息。这根绳子是从哪里来的?你提到一个API?

这是:stackoverflow.com/questions/1005857/…

请不要把已经回答的问题改成另一个问题。打开一个新问题。

stackoverflow.com/q/3822839/1066234副本

如果你是打电话的方法的一些类,你可以使用正常的可变扩建。例如: P / < >

class thingie {

public function sayHello() {

return"hello";

}

}

$t = new thingie();

echo"thingie says: {$t->sayHello()}";

这将输出: P / < >

thingie says: hello

注意,braces周围的召唤,是需要的。 P / < >

但是这样调用一个全局函数似乎行不通

通过将要支持的全局函数包装在方法对象中,可以控制暴露于错误和安全性泄漏的足迹。我认为你很难找到一种更简单的方法来/安全地/提供这种力量。如果需要,您的包装方法甚至可以执行额外的验证/限制。

就用这个: P / < >

$str ="abcdefg".foo()."hijklmnopqrstuvwxyz";

它将呼叫功能期间创作的字符串。 P / < >

API只是给了我一个字符串,所以不能形成这种格式。

您想使用什么功能?

@爱情春天这是一个可怕的安排。您使用的是什么API来实现这一点?

我可以调用但不能修改其他人的代码,他没有给我一个API,我必须钩住$str来注入我的代码。

@爱泉在清澈??

$str="abcdefg foo() hijklmopqrst";

function foo() {return"bar";}

$replaced = preg_replace_callback("~([a-z]+)\(\)~",

function ($m){

return $m[1]();

}, $str);

输出: P / < >

$replaced == 'abcdefg bar hijklmopqrst';

这将允许任何情况下世纪文学功能的名称。如果你需要的任何其他symbols,给他们的pattern,公元前[a-zA-Z_]。 P / < >

很小心,功能允许你去叫。你应该至少检查,如果美元米[ 1 ] contains的whitelisted功能到不允许remote代码attacks溶液注射。 P / < >

$allowedFunctions = array("foo","bar" /*, ...*/);

$replaced = preg_replace_callback("~([a-z]+)\(\)~",

function ($m) use ($allowedFunctions) {

if (!in_array($m[1], $allowedFunctions))

return $m[0]; // Don't replace and maybe add some errors.

return $m[1]();

}, $str);

testrun C "abcdefg foo() bat() hijklmopqrst"outputs "abcdefg bar bat() hijklmopqrst"。 P / < >

optimisation为whitelisting进场(建筑pattern dynamically从allowed功能名称,公元前(foo|bar)。 P / < >

$allowedFunctions = array("foo","bar");

$replaced = preg_replace_callback("~(".implode("|",$allowedFunctions).")\(\)~",

function ($m) {

return $m[1]();

}, $str);

如果函数有参数呢?

function foo()

{

return 'Hi';

}

$my_foo = 'foo';

echo"{$my_foo()}";

这是一个很好的"技巧",您甚至可以将参数或其他变量传递给它,例如echo"{$my_foo('bar')}"或echo"{$my_foo($bar)}",在使用许多转义值构建SQL查询时尤其有用。

哇,太棒了!

$foo = foo();

$str ="abcdefg {$foo} hijklmopqrst";

我必须在$str时间内调用foo()。

@你的意思是在以后的某个时候?也许你在找eval($str)。

得到arbitrary expressions被evaluated从双上市的字符串,你可以在speculate可变-功能: P / < >

// A user function

function foo() {

return 'bar';

}

/**

* The hack

*

* @param $v mixed Value

* return mixed Value (untouched)

*/

$_ = function ( $v ) {

return $v;

};

// Happy hacking

echo"Foo is {$_( foo() )} and the sum is {$_( 41 + 1 )}...{$_( str_repeat( ' arrh', 3 ) )}!";

结果: P / < >

Foo is bar and the sum is 42... arrrh arrrh arrrh!

references: P / < >

https:/ / / / / / functions.variable-functions.php EN secure.php.net手册

secure.php.net https:/ / / / / /它language.types.string.php # language.types.string.parsing手册

它仍然是不可能的,有hacks可用,但不是什么我会推荐而suggest粘到与老式的公元前$str="abcdefg". foo() ." hijklmopqrst";点算子 P / < >

每级的复杂(卷曲)语法文件 P / < >

Note:

Functions, method calls, static class variables, and class constants inside {$} work since PHP 5. However, the value accessed will be interpreted as the name of a variable in the scope in which the string is defined. Using single curly braces ({}) will not work for accessing the return values of functions or methods or the values of class constants or static class variables.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是回复: 可以在主程序输入一个字符串,然后调用函数strreverse来实现字符串的逆置。strreverse函数可以接收一个字符串作为参数,并返回一个逆置后的字符串。在主程序,可以先定义一个字符串变量,然后使用scanf函数来读取用户输入的字符串。接着,调用strreverse函数来实现字符串的逆置,并将结果打印出来。具体的代码实现可以参考下面的示例: #include <stdio.h> #include <string.h> char* strreverse(char* str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = temp; } return str; } int main() { char str[100]; printf("请输入一个字符串:"); scanf("%s", str); printf("原始字符串:%s\n", str); printf("逆置后的字符串:%s\n", strreverse(str)); return 0; } 在上面的代码,strreverse函数接收一个字符串作为参数,然后使用循环来实现字符串的逆置。具体来说,它首先计算字符串的长度,然后使用一个循环来交换字符串对应位置的字符,直到循环到字符串间位置。最后,它返回逆置后的字符串。在主程序,我们首先定义一个字符串变量str,然后使用scanf函数来读取用户输入的字符串。接着,我们调用strreverse函数来实现字符串的逆置,并将结果打印出来。 ### 回答2: 在主程序输入一个字符串并实现字符串的逆置,可以采用如下的步骤: 1. 首先,在主程序定义一个字符串变量,用于存储用户输入的字符串,代码如下: char str[100]; 2. 然后,使用scanf函数获取用户输入的字符串,代码如下: printf("请输入一个字符串:"); scanf("%s", str); 3. 接下来,定义一个函数strreverse,该函数接收一个字符串参数,并将其逆置,代码如下: void strreverse(char *str){ int len = strlen(str); for(int i = 0; i < len / 2; i++){ char temp = str[i]; str[i] = str[len-1-i]; str[len-1-i] = temp; } } 4. 最后,在主程序调用函数strreverse,并输出逆置后的字符串,代码如下: strreverse(str); printf("逆置后的字符串为:%s\n", str); 完整代码如下: #include <stdio.h> #include <string.h> void strreverse(char *str); int main(){ char str[100]; printf("请输入一个字符串:"); scanf("%s", str); strreverse(str); printf("逆置后的字符串为:%s\n", str); return 0; } void strreverse(char *str){ int len = strlen(str); for(int i = 0; i < len / 2; i++){ char temp = str[i]; str[i] = str[len-1-i]; str[len-1-i] = temp; } } ### 回答3: 字符串逆置是指将一个字符串的字符顺序颠倒过来,例如将"hello"变为"olleh"。实现字符串逆置的方法有很多种,其一种比较简单的方法是使用一个函数来完成。 在C语言,用来逆置字符串函数叫做strreverse,函数的原型为: void strreverse(char *str); 可以看出,函数的参数是一个指向字符串的指针,函数的作用是将这个字符串逆置。 下面我们来看一下如何在主程序输入一个字符串,并调用strreverse函数进行字符串逆置。 1、首先,在主函数声明一个字符串变量,用来存储用户输入的字符串。 char str[100]; 2、然后使用scanf函数从键盘输入字符串,格式为"%s"。 printf("请输入字符串:"); scanf("%s", str); 3、接着调用strreverse函数对输入的字符串进行逆置。 strreverse(str); 4、最后输出逆置后的字符串即可。 printf("逆置后的字符串是:%s", str); 完整代码如下: #include <stdio.h> void strreverse(char *str); int main() { char str[100]; printf("请输入字符串:"); scanf("%s", str); strreverse(str); printf("逆置后的字符串是:%s", str); return 0; } void strreverse(char *str) { char temp; int len = strlen(str) - 1; int i, j; for (i = 0, j = len; i < j; i++, j--) { temp = str[i]; str[i] = str[j]; str[j] = temp; } } 在函数strreverse,我们使用了一个循环来逆置字符串。具体来说,我们使用两个指针i和j分别指向字符串的头尾,然后依次将i和j指向的字符互换,直到它们相遇为止。这个过程,我们需要借助一个临时变量temp来进行交换。 总之,要实现字符串逆置,我们只需要调用C语言的strreverse函数即可。函数的参数是一个指向字符串的指针,函数的作用是将这个字符串逆置。如果需要在主程序实现字符串逆置,只需要先声明一个字符串变量,从键盘输入字符串,然后调用strreverse函数进行逆置,最后再输出逆置后的字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值