我在*.properties
文件中存儲了一些字符串。字符串的一個例子是:解析字符串中的變量
sendingFrom = 發送從{$ oEmails-> AGENTNAME},電子郵件到{$ oEmails-> customerCount}人。
我的函數需要從sendingFrom
值,然後輸出頁面上的字符串,但它不會自動內解析{$oEmails->agentName}
。有沒有一種方法,沒有手動解析,讓我把PHP從字符串轉換變量,到它應該是什麼?
我在*.properties
文件中存儲了一些字符串。字符串的一個例子是:解析字符串中的變量
sendingFrom = 發送從{$ oEmails-> AGENTNAME},電子郵件到{$ oEmails-> customerCount}人。
我的函數需要從sendingFrom
值,然後輸出頁面上的字符串,但它不會自動內解析{$oEmails->agentName}
。有沒有一種方法,沒有手動解析,讓我把PHP從字符串轉換變量,到它應該是什麼?
如果你可以修改你*.properties
,這裏是一個簡單的解決方案:
# in file.properties
sendingFrom = Sending emails from %s, to %s people.
然後更換%s
有正確的價值觀,用sprintf:
// Get the sendingFrom value from file.properties to $sending_from, and:
$full_string = sprintf($sending_from, $oEmails->agentName, $oEmails->customerCount);
它可以讓你將您的應用程序的邏輯(變量,以及如何獲得它們)從演示文稿中分離出來(實際的字符串方案,存儲在file.properties
)。
你可以使用Eval和所有常見的安全魚子醬
類似。
$string = getStringFromFile('sendingFrom');
$FilledIn = eval($string);
如果僅僅有一個'eval_vars'功能。 – James
有很多與'eval'相關的安全問題。例如,如果有人設法修改'file.properties',他可以做非常糟糕的事情,因爲PHP將運行代碼。不要使用'eval'。 –
@idiqual,那是什麼安全警告。然而,只是不使用它可能是一個更好的警告。 –
只是一種選擇。
$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.
如其他人所說的eval是不恰當的,我建議preg_replace
或preg_replace_callback
如果你需要更多的靈活性。
preg_replace_callback('/\$(.+)/', function($m) {
// initialise the data variable from your object
return $data[$m[1]];
}, $subject);
檢查此鏈接出來爲好,它建議使用的strstr
How replace variable in string with value in php?
啊,現在這是一個聰明的想法!謝謝:) – James
我也喜歡這種方法。如果你改變你的變量名稱,你也不需要修改你的文件。 – EmmanuelG
這很完美。我有一個功能,輸出帶有一些額外格式的消息。我剛剛使用'vsprintf'來接受我的論點(從3開始)和輸出。清潔和簡單。真棒的想法,非常感謝你! – James