如果它是数组项,则按名称获取变量值,可能来自超全局变量
Get value of variable by name in case it is array item, possibly from superglobal
如果它引用索引数组项,是否完全有可能从按名称访问的变量中获取值?实际上我打算用 $_SERVER['HTTP_HOST'] 来做这个技巧,但我发现 $$ 不能很好地处理任何特定的数组项。
$a = '555';
$b = 'a';
var_dump($$b);
$a = array (1,2,3);
$b = 'a';
var_dump($$b);
$b = 'a[1]';
var_dump($$b);
前两个 vardump 按预期工作,但最后一个给出 注意:未定义的变量:a[1],即使它显然存在。我想要 return 2.
更新:PHP 7.1.16
这是仅适用于字符串或数字数组的简单解析器
function parse($str) {
// regex explanation:
// ^ - beging of the string
// valid name inside capture group with at least one character
// \[ literal open bracket
// ([^\]]+) - capture group with non closing bracket
// \] - closing bracket
// $ - end of string
$re = "/^([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\[([^\]]+)\]$/";
if (preg_match($re, $str, $match)) {
$var = $match[1];
global $$var;
// regex for any integer
if (preg_match("/^[0-9]+$/", $match[2])) {
// convert integera like string to integer
return $$var[intval($match[2])];
} else {
// remove quotes from beginning and ending of a string
return $$var[trim($match[2], "\"'")];
}
} else {
return $$str;
}
}
$a = array (1,2,3);
$b = 'a';
var_dump($$b);
$b = 'a[1]';
var_dump(parse($b));
$a = array("foo" => "hello");
$b = 'a["foo"]';
var_dump(parse($b));
echo parse("_SERVER['HTTP_HOST']");
变量名的正则表达式可以在 php docs
中找到
唯一的限制是变量需要是全局的,但是 _SERVER 始终是全局的,所以这无关紧要。
如果它引用索引数组项,是否完全有可能从按名称访问的变量中获取值?实际上我打算用 $_SERVER['HTTP_HOST'] 来做这个技巧,但我发现 $$ 不能很好地处理任何特定的数组项。
$a = '555';
$b = 'a';
var_dump($$b);
$a = array (1,2,3);
$b = 'a';
var_dump($$b);
$b = 'a[1]';
var_dump($$b);
前两个 vardump 按预期工作,但最后一个给出 注意:未定义的变量:a[1],即使它显然存在。我想要 return 2.
更新:PHP 7.1.16
这是仅适用于字符串或数字数组的简单解析器
function parse($str) {
// regex explanation:
// ^ - beging of the string
// valid name inside capture group with at least one character
// \[ literal open bracket
// ([^\]]+) - capture group with non closing bracket
// \] - closing bracket
// $ - end of string
$re = "/^([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\[([^\]]+)\]$/";
if (preg_match($re, $str, $match)) {
$var = $match[1];
global $$var;
// regex for any integer
if (preg_match("/^[0-9]+$/", $match[2])) {
// convert integera like string to integer
return $$var[intval($match[2])];
} else {
// remove quotes from beginning and ending of a string
return $$var[trim($match[2], "\"'")];
}
} else {
return $$str;
}
}
$a = array (1,2,3);
$b = 'a';
var_dump($$b);
$b = 'a[1]';
var_dump(parse($b));
$a = array("foo" => "hello");
$b = 'a["foo"]';
var_dump(parse($b));
echo parse("_SERVER['HTTP_HOST']");
变量名的正则表达式可以在 php docs
中找到唯一的限制是变量需要是全局的,但是 _SERVER 始终是全局的,所以这无关紧要。