[英]How can I use a variable variable in PHP?
這是我正在嘗試做的事情:
<?php
$my_str = "My String";
$str = "%my_str";
$str = str_replace("%", "$", $str);
echo $str;
?>
上面的代碼在屏幕上顯示“ $ my_str”。 但我希望它打印“我的字符串”,如變量$ my_str的實際值
有人知道怎么做嗎?
我想要這樣做的原因是因為我正在編寫自己的非常基本的解析語言,因此在繼續之前,我有點需要這種功能。
$my_str = 'My String';
$str = 'my_str';
echo $$str;
這種構造稱為可變變量 。
評估是沒有必要的。 只需去除%並使用$$ str
<?php
$my_str = "My String";
$str = "%my_str";
$str = str_replace("%", "", $str);
echo $$str;
?>
您可以使用preg_replace
和e
修飾符搜索並替換%var
模式,從而對替換進行評估:
<?php
$my_str = "My String";
$str = "Foo %my_str bar";
$str = preg_replace("/%([A-Za-z_]+)/e", "$\\1", $str);
echo $str;
?>
在這里preg_replace
將找到%my_str
, \\1
包含my_str
, "$\\\\1"
(需要轉義反斜杠)成為$ my_str的值。
但是,將替換字符串存儲在關聯數組中可能會更干凈:
<?php
$replacements = array(
"my_str" => "My String",
);
$str = "Foo %my_str bar";
$str = preg_replace("/%([A-Za-z_]+)/e", '$replacements["\\1"]', $str);
echo $str;
?>
嘗試:
echo $$str;
如何將正則表達式與e修飾符一起使用
$str = preg_replace("/%([a-zA-Z0-9_]+)/e", '$\1', $str);
(這未經測試,但應該可以)
您看到的行為不足為奇-變量的擴展(“插值”)僅對字符串文字執行,而不對變量執行。 如果不是這樣,那將是一個很大的安全漏洞(使用$的任何包含$的字符串實例將突然暴露出變量)。
您可以嘗試使用eval修復此問題,如下所示
eval ("\$str = \"" . str_replace("%", "\$", $str) . "\"");
但這很危險-如果您的字符串來自用戶,則可以使$ str像
"; system("rm -rf /"); $x = "
突然之間,您遇到了麻煩。 我認為,最好的解決方案是使用您喜歡的方法(帶狀線和子串或其他)解析變量,然后手動替換每個變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.