PHP中如何从字符串提取数组值?是否可用内置函数或正则?
嘿,这个问题我熟!咱们来聊聊怎么在PHP里把这种数组格式的字符串转成真正的数组~
方法一:用
eval()直接解析(注意安全风险) 如果你的字符串是合法的PHP数组语法(比如你示例里补全后),PHP的eval()是最直接的预定义函数,它能执行字符串里的PHP代码,直接把字符串转成数组。
⚠️ 重点提醒:这个函数风险极高!只有当你完全可控这个字符串(比如是自己生成的,不是用户输入或其他不可信来源)的时候才能用,不然很容易被注入恶意代码!
示例代码:
// 先把你的字符串补全成合法的PHP数组格式 $rule = "array( array('parameter'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'), array('parameter'=> 'DestinationZone', 'values'=>'l3-internet', 'condition'=>'EQUALS', 'rule type'=>'AND'), array('parameter'=> 'Application', 'values'=>'ftp,sftp', 'condition'=>'EQUALS') )"; // 使用eval把字符串转成数组 eval("\$extractedArray = $rule;"); // 现在就能正常操作这个数组了 print_r($extractedArray);
方法二:更安全的替代方案(推荐)
因为eval()太危险,尤其是处理不可信内容时,推荐用下面两种更安全的方式:
方案A:用PHP Tokenizer解析
PHP自带的token_get_all()可以把字符串拆成PHP语法令牌,我们可以基于这个安全地解析数组结构,完全不用担心恶意代码:
function parseArrayString($str) { $tokens = token_get_all('<?php ' . $str); $result = []; $current = &$result; $stack = []; $key = null; foreach ($tokens as $token) { if (is_array($token)) { switch ($token[0]) { case T_ARRAY: $stack[] = &$current; $newArray = []; $current[] = &$newArray; $current = &$newArray; break; case T_CONSTANT_ENCAPSED_STRING: $value = trim($token[1], '\'"'); if ($key === null) { $key = $value; } else { $current[$key] = $value; $key = null; } break; case T_DOUBLE_ARROW: // 标记下一个字符串是对应的值 break; } } elseif ($token === ')') { if (!empty($stack)) { $current = &$stack[count($stack)-1]; array_pop($stack); } } } return $result[0]; } // 测试补全后的字符串 $rule = "array( array('parameter'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'), array('parameter'=> 'DestinationZone', 'values'=>'l3-internet', 'condition'=>'EQUALS', 'rule type'=>'AND'), array('parameter'=> 'Application', 'values'=>'ftp,sftp', 'condition'=>'EQUALS') )"; $extractedArray = parseArrayString($rule); print_r($extractedArray);
方案B:转成JSON再解析
如果你的数组字符串格式比较规整,没有复杂的嵌套或特殊字符,也可以把它转换成JSON格式,再用json_decode()解析:
$rule = "array( array('parameter'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'), array('parameter'=> 'DestinationZone', 'values'=>'l3-internet', 'condition'=>'EQUALS', 'rule type'=>'AND'), array('parameter'=> 'Application', 'values'=>'ftp,sftp', 'condition'=>'EQUALS') )"; // 把PHP数组语法替换成JSON格式 $jsonStr = str_replace(['array(', ')', '\''], ['[', ']', '"'], $rule); $jsonStr = str_replace('=>', ':', $jsonStr); // 解析JSON为数组 $extractedArray = json_decode($jsonStr, true); print_r($extractedArray);
这个方法的局限性是如果字符串里有嵌套的单引号或者特殊转义,需要额外处理,不然会解析失败。
关于正则表达式?
其实不太推荐用正则来做这件事,因为PHP数组的结构可能很复杂(比如多层嵌套、不同类型的值),正则很难覆盖所有情况,很容易出现解析错误。除非你的数组结构极其简单,否则别折腾正则啦。
内容的提问来源于stack exchange,提问作者Siddhu
相关产品推荐
相关产品推荐

