解析字符串中的变量

Parse variables within string

提问人:James 提问时间:5/24/2012 更新时间:3/11/2014 访问量:2001

问:

我正在文件中存储一些字符串。字符串的一个示例是:*.properties

sendingFrom=从 {$oEmails->agentName} 向 {$oEmails->customerCount} 人员发送电子邮件。

我的函数从中获取值,然后在页面上输出该字符串,但它不会自动解析内部。有没有办法,在不手动解析的情况下,让我让PHP将变量从字符串转换为它应该有的样子?sendingFrom{$oEmails->agentName}

php 字符串 变量

评论


答:

0赞 Toby Allen 5/24/2012 #1

您可以将 Eval 与所有常用的安全 caviat 一起使用

类似的东西。

$string = getStringFromFile('sendingFrom');

$FilledIn = eval($string);

评论

2赞 James 5/24/2012
要是有函数就好了。eval_vars
2赞 ldiqual 5/24/2012
有很多与 相关的安全问题。例如,如果有人设法修改,他可以做非常糟糕的事情,因为 php 将运行代码。不要使用 .evalfile.propertieseval
0赞 Toby Allen 5/24/2012
@idiqual,这就是安全警告。但是,不要使用它可能是一个更好的警告。
4赞 ldiqual 5/24/2012 #2

如果您可以修改您的 ,这里有一个简单的解决方案:*.properties

# in file.properties
sendingFrom = Sending emails from %s, to %s people.

然后使用 sprintf 替换为正确的值:%s

// Get the sendingFrom value from file.properties to $sending_from, and:
$full_string = sprintf($sending_from, $oEmails->agentName, $oEmails->customerCount);

它允许您将应用程序的逻辑(变量以及获取它们的方式)与演示文稿(实际的字符串方案,存储在 中)分开。file.properties

评论

0赞 James 5/24/2012
啊,现在这是一个聪明的主意!谢谢你:)
1赞 EmmanuelG 5/24/2012
我也喜欢这种方法。如果您更改了变量名称,则不必修改文件。
0赞 James 5/24/2012
太完美了。我有一个函数,可以输出带有一些额外格式的消息。我只是习惯于接受我的论点(从 3 开始)和输出。干净简单。很棒的主意,非常感谢!vsprintf
2赞 inhan 5/24/2012 #3

只是一个选择。

$oEmails = new Emails('Me',4);
$str = 'sendingFrom=Sending emails from {$oEmails->agentName}, to {$oEmails->customerCount} people.';

// --------------

$arr = preg_split('~(\{.+?\})~',$str,-1,PREG_SPLIT_DELIM_CAPTURE);
for ($i = 1; $i < count($arr); $i+=2) {
    $arr[$i] = eval('return '.substr($arr[$i],1,-1).';');
}
$str = implode('',$arr);
echo $str;
// sendingFrom=Sending emails from Me, to 4 people.
1赞 filype 3/11/2014 #4

正如其他人提到的 eval 不合适,如果您需要更大的灵活性,我建议 a 或 a。preg_replacepreg_replace_callback

preg_replace_callback('/\$(.+)/', function($m) {
     // initialise the data variable from your object  
     return $data[$m[1]];
}, $subject);

也检查此链接,它建议使用 如何在 php 中将字符串中的变量替换为值?strstr