从html输入名称获取php子数组

时间:2012-01-13 11:46:39

标签: php html regex

我有一个输入:

<input name="subscription[login]" />

我正在创建一个带数组的函数(示例为$_POST)和html名称(subscription[login])。

它应该返回$_POST['subscripton']['login']

的引用

所以我做了:

public static function &getSubArrayRefFromPath($arr, $arrPath) {
    if(!is_array($arrPath)) {
        throw new Exception('$arrPath is not an array');
    }
    else {
        $el = $arr;

        foreach($arrPath as $k) {
            $el &= $el[$k];
        }

        return $el;
    }
}

public static function &getSubArrayRefFromHtmlPath($arr, $htmlPath) {
    $regex = '#^([a-z]+)(?:\[([a-z]+)\]){2}(\[\])?$#i';

    preg_match($regex, $htmlPath, $rawKeys);

}

但我无法使用正则表达式检索所有值:

我在rawKeys中得到这个:

array
  0 => string 'abc[def][ghi]' (length=13)
  1 => string 'abc' (length=3)
  2 => string 'ghi' (length=3)

我可能错过了一些东西......

2 个答案:

答案 0 :(得分:0)

锂框架有一个非常方便的结构叫做Set:

include 'Set.php'
$ary = array('a' => array('b' => 1, 'c' => 2), 'd' => 3);

lithium\util\Set::extract($ary, '/a/b')
-> array(1)
lithium\util\Set::extract($ary, '/a/.');
-> array(array('b' => 1, 'c' => 2))
lithium\util\Set::extract($ary, '/a/@*');
-> array(array('b', 'c'))

修改

对于不那么强大的东西:

function find(&$ary, $key) {
    if (strstr($key, '.')) {
        list($k, $key) = explode('.', $key, 2);
        return find($ary[$k], $key);
    } else {
        return $ary[$key];
    }
}

find($ary, 'a');
-> array('b' => 1, 'c' => 2)
find($ary, 'a.b');
-> 1

我想你可以弄清楚如何自己将a[b]转换为a.b(提示:它在评论中)

答案 1 :(得分:0)

工作正则表达式:

'#^([a-z]+)(?:\[([a-z]+)\])(?:\[([a-z]+)\])$#i'

结果defghi覆盖(在您的示例abc[def][ghi]中),这就是为什么您最终只得到两个结果。

要删除第一个元素(始终是与完整模式匹配的文本),请使用:

unset($rawKeys[0]);