提问人:James 提问时间:5/24/2012 更新时间:3/11/2014 访问量:2001
解析字符串中的变量
Parse variables within string
问:
我正在文件中存储一些字符串。字符串的一个示例是:*.properties
sendingFrom=从 {$oEmails->agentName} 向 {$oEmails->customerCount} 人员发送电子邮件。
我的函数从中获取值,然后在页面上输出该字符串,但它不会自动解析内部。有没有办法,在不手动解析的情况下,让我让PHP将变量从字符串转换为它应该有的样子?sendingFrom
{$oEmails->agentName}
答:
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 将运行代码。不要使用 .eval
file.properties
eval
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_replace
preg_replace_callback
preg_replace_callback('/\$(.+)/', function($m) {
// initialise the data variable from your object
return $data[$m[1]];
}, $subject);
也检查此链接,它建议使用 如何在 php 中将字符串中的变量替换为值?strstr
上一个:PHP:变量中的类属性链接
评论