Tengo un formulario que tiene campos de entrada con claves multidimensionales. Y las claves contienen consultas XPath.

Cuando envío mi formulario, las claves de la matriz se estropean.

Este es un simple ejemplo de mi código.

<!DOCTYPE html>
<html>
<body>
<?php if (isset($_POST['key'])){
    var_dump($_POST['key']);
}

$attr = '//*[self::textarea or self::input]/@placeholder';
?>
<form action="" method="post">

    <input type="text" name="key[1][<?php echo $attr;?>]">

    <input type="submit" value="Submit">
</form>

</body>
</html>

Respuesta de var_dump

array(1) {
  [1]=>
  array(1) {
    ["//*[self::textarea or self::input"]=>
    string(3) "asd"
  }
}

¿Cómo puedo escapar de las llaves? Espero que alguien pueda dar una respuesta.

No ofrezca resolver este problema con json o de otra manera.

1
Aaron Yordanyan 18 dic. 2019 a las 00:57

2 respuestas

Puede usar urlencode para escapar del {{X1 }}, y luego use array_walk sobre $_POST['key'] para reemplazar las claves con su versión urldecode:

if (isset($_POST['key'])) {
    array_walk($_POST['key'], function (&$a) {
        $a = array(urldecode(key($a)) => current($a));
    });
}
var_dump($_POST);

$attr = '//*[self::textarea or self::input]/@placeholder';
?>
<form action="" method="post">

    <input type="text" name="key[1][<?php echo urlencode($attr);?>]">

    <input type="submit" value="Submit">
</form>

Salida:

array(1) {
  ["key"]=>
  array(1) {
    [1]=>
    array(1) {
      ["//*[self::textarea or self::input]/@placeholder"]=>
      string(3) "asd"
    }
  }
}

Si tiene varios elementos debajo de cada valor numérico key, deberá usar un foreach dentro de array_walk:

if (isset($_POST['key'])) {
    array_walk($_POST['key'], function (&$a) {
        foreach ($a as $key => $value) {
            $a[urldecode($key)] = $value;
            unset($a[$key]);
        }
    });
}
1
Nick 17 dic. 2019 a las 22:26

Use htmlspecialchars().

    <input type="text" name="key[1][<?php echo htmlspecialchars($attr);?>]">
0
Barmar 17 dic. 2019 a las 22:12