解析格式不正确的 URL 查询字符串,其中重复键缺少 []

发布于 2024-09-06 05:49:42 字数 343 浏览 9 评论 0原文

我的字符串类似于以下格式:

$string = "name=xxx&id=11&name=yyy&id=12&name=zzz&id=13&name=aaa&id=10";

我想像下面这样分割字符串:

$str[0] = "name=xxx&id=11";
$str[1] = "name=yyy&id=12";
$str[2] = "name=zzz&id=13";
$str[3] = "name=aaa&id=10";

如何在 PHP 中执行此操作?

My string is like the following format:

$string = "name=xxx&id=11&name=yyy&id=12&name=zzz&id=13&name=aaa&id=10";

I want to split the string like the following:

$str[0] = "name=xxx&id=11";
$str[1] = "name=yyy&id=12";
$str[2] = "name=zzz&id=13";
$str[3] = "name=aaa&id=10";

How can I do this in PHP?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

吃颗糖壮壮胆 2024-09-13 05:49:42

试试这个:

$matches = array();
preg_match_all("/(name=[a-zA-Z0-9%_-]+&id=[0-9]+)/",$string,$matches);

$matches 现在是一个包含您想要的字符串的数组。

更新

function get_keys_and_values($string /* i.e. name=yyy&id=10 */) {
  $return = array();
  $key_values = split("&",$string);
  foreach ($key_values as $key_value) {
    $kv_split = split("=",$key_value);
    $return[$kv_split[0]] = urldecode($kv_split[1]);
  }
  return $return;
}

Try this:

$matches = array();
preg_match_all("/(name=[a-zA-Z0-9%_-]+&id=[0-9]+)/",$string,$matches);

$matches is now an array with the strings you wanted.

Update

function get_keys_and_values($string /* i.e. name=yyy&id=10 */) {
  $return = array();
  $key_values = split("&",$string);
  foreach ($key_values as $key_value) {
    $kv_split = split("=",$key_value);
    $return[$kv_split[0]] = urldecode($kv_split[1]);
  }
  return $return;
}
两个我 2024-09-13 05:49:42
$string = "name=xxx&id=11&name=yyy&id=12&name=zzz&id=13&name=aaa&id=10";
$arr = split("name=", $string);

$strings = aray();
for($i = 1; $i < count($arr), $i++){
    $strings[$i-1] = "name=".substr($arr[$i],0,-1);
}

结果将在 $strings 中

$string = "name=xxx&id=11&name=yyy&id=12&name=zzz&id=13&name=aaa&id=10";
$arr = split("name=", $string);

$strings = aray();
for($i = 1; $i < count($arr), $i++){
    $strings[$i-1] = "name=".substr($arr[$i],0,-1);
}

The results will be in $strings

梦归所梦 2024-09-13 05:49:42

我建议使用更简单的术语

这是一个例子

$string = "name=xxx&id=11;name=yyy&id=12;name=zzz&id=13;name=aaa&id=10";
$arr = explode(";",$string); //here is your array

I will suggest using much simpler term

Here is an example

$string = "name=xxx&id=11;name=yyy&id=12;name=zzz&id=13;name=aaa&id=10";
$arr = explode(";",$string); //here is your array
相思故 2024-09-13 05:49:42

对此格式错误的查询字符串进行的任何手术都可能会损坏数据。

如果您知道输入的键名称或值中不会包含 =,那么您可以通过在每个键之间注入 [] 来更正查询字符串键名和等号,然后正常解析它并根据需要进行转置。

代码:(Demo)

parse_str(str_replace('=', '[]=', $string), $array);
var_export(array_map(fn($name, $id) => get_defined_vars(), $array['name'], $array['id']));

输出:

array (
  0 => 
  array (
    'name' => 'xxx',
    'id' => '11',
  ),
  1 => 
  array (
    'name' => 'yyy',
    'id' => '12',
  ),
  2 => 
  array (
    'name' => 'zzz',
    'id' => '13',
  ),
  3 => 
  array (
    'name' => 'aaa',
    'id' => '10',
  ),
)

如果这还不够严格,您可以收紧替换流程以显式提名nameid 键。

parse_str(preg_replace('/\b(name|id)\K(?==)/', '[]', $string), $array);

理想情况下,如果您可以控制生成此提交负载的表单字段,则最应该简单地添加 [] 字段的 name 属性(name)。 input type="text" name="name[]">) 或以其他方式更正该过程这会在有效负载中造成关键冲突。

Any surgery conducted on this malformed querystring may potentially corrupt data.

If you know that the input will not have = in the key name or values, then you can correct the querystring by injecting [] between each key name and the equals sign, then parse it normally and transpose if you wish.

Code: (Demo)

parse_str(str_replace('=', '[]=', $string), $array);
var_export(array_map(fn($name, $id) => get_defined_vars(), $array['name'], $array['id']));

Output:

array (
  0 => 
  array (
    'name' => 'xxx',
    'id' => '11',
  ),
  1 => 
  array (
    'name' => 'yyy',
    'id' => '12',
  ),
  2 => 
  array (
    'name' => 'zzz',
    'id' => '13',
  ),
  3 => 
  array (
    'name' => 'aaa',
    'id' => '10',
  ),
)

If this isn't strict enough, you can tighten the replacement process to explicitly nominate name and id keys.

parse_str(preg_replace('/\b(name|id)\K(?==)/', '[]', $string), $array);

Ideally, if you have control of the form fields which are producing this submission payload, you should most simply add [] the the fields' name attributes (<input type="text" name="name[]"> and <input type="text" name="id[]">) or otherwise correct the process that is creating key collisions in the payload.

彼岸花似海 2024-09-13 05:49:42

如果你想做你要求的事情,不多不少,那就是explode('&', $string)。

如果你的例子搞砸了,并且你有一个 HTTP 查询字符串,那么你想看看 parse_str()。

If you want to do what you asked, nothing more or less , that's explode('&', $string).

If you have botched up your example and you have a HTTP query string then you want to look at parse_str().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文