2012-05-23 100 views
0

我在*.properties文件中存儲了一些字符串。字符串的一個例子是:解析字符串中的變量

sendingFrom = 發送從{$ oEmails-> AGENTNAME},電子郵件到{$ oEmails-> customerCount}人。

我的函數需要從sendingFrom值,然後輸出頁面上的字符串,但它不會自動內解析{$oEmails->agentName}。有沒有一種方法,沒有手動解析,讓我把PHP從字符串轉換變量,到它應該是什麼?

回答

4

如果你可以修改你*.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)。

+0

啊,現在這是一個聰明的想法!謝謝:) – James

+1

我也喜歡這種方法。如果你改變你的變量名稱,你也不需要修改你的文件。 – EmmanuelG

+0

這很完美。我有一個功能,輸出帶有一些額外格式的消息。我剛剛使用'vsprintf'來接受我的論點(從3開始)和輸出。清潔和簡單。真棒的想法,非常感謝你! – James

0

你可以使用Eval和所有常見的安全魚子醬

類似。

$string = getStringFromFile('sendingFrom'); 

$FilledIn = eval($string); 
+2

如果僅僅有一個'eval_vars'功能。 – James

+2

有很多與'eval'相關的安全問題。例如,如果有人設法修改'file.properties',他可以做非常糟糕的事情,因爲PHP將運行代碼。不要使用'eval'。 –

+0

@idiqual,那是什麼安全警告。然而,只是不使用它可能是一個更好的警告。 –

2

只是一種選擇。

$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

如其他人所說的eval是不恰當的,我建議preg_replacepreg_replace_callback如果你需要更多的靈活性。

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

檢查此鏈接出來爲好,它建議使用的strstrHow replace variable in string with value in php?