正在拆分GET字符串


Splitting GET string

我需要将GET字符串拆分为一些数组。字符串如下:

ident[0]=<IDENT_0>&value[0]=<VALUE_0>&version[0]=<VERSION_0>&....&ident[N]=<IDENT_N>&value[N]=<VALUE_N>&version[N]=<VERSION_N>

所以,我需要用每三个"与"字符来分割这个字符串,比如:

ident[0]=<IDENT_0>&value[0]=<VALUE_0>&version[0]=<VERSION_0>
ident[1]=<IDENT_1>&value[1]=<VALUE_1>&version[1]=<VERSION_1> and so on...

我该怎么做?我应该使用什么正则表达式?或者有更好的方法吗?

有一种更好的方法(假设这是发送到PHP页面的数据,而不是您正在处理的其他事情)。

PHP提供了一个名为$_GET的"神奇"数组,它已经为您解析了值。

例如:

one=1&two=2&three=3

将导致此阵列:

Array ( [one] => 1 [two] => 2 [three] => 3 )

所以你可以访问这样的变量:

$oneValue = $_GET['one'];  // answer is 1
$twoValue = $_GET['two'];  // and so on

如果您提供数组索引(您的示例就是这样做的),它也会为您对这些索引进行排序。因此,使用上面的$_GET示例如下:

Array
(
    [ident] => Array
        (
            [0] => <IDENT_0>
            [N] => <IDENT_N>
        )
    [value] => Array
        (
            [0] => <VALUE_0>
            [N] => <VALUE_N>
        )
    [version] => Array
        (
            [0] => <VERSION_0>
            [N] => <VERSION_N>
        )
)

我假设你的N密钥实际上是数字,所以你可以这样查找它们:

$_GET['ident'][0]     // =>   <IDENT_0>
$_GET['value'][0]     // =>   <VALUE_0>
$_GET['version'][0]   // =>   <VERSION_0>

你可以在它们之间循环,或者其他什么,你永远不必担心自己把它们都分解掉。

希望它能帮助你。

您可以将preg_split与以下模式一起使用:&(?=ident)

$result = preg_split('~&(?=ident)~', $yourstring);

正则表达式详细信息:&(?=ident)表示&,后跟ident

(?=..)是一个前瞻性断言,它只执行一次检查,但不匹配任何内容。

或者使用preg_match_all

preg_match_all('~(?<=^|&)[^&]+&[^&]+&[^&]+(?=&|$)~', $yourstring, &matches);
$result = $matches[0];

模式细节:(?<=..)是一个后备断言

(?<=^|&)表示字符串^开头的或一个与号
[^&]+表示除与号之外的所有字符和一次或多次
(?=&|$)表示后面跟一个"与"或字符串$的末尾

或者,您可以使用分解,然后使用进行循环:

$items = explode('&', $yourstring);
for ( $i=0; $i<sizeof($items); $i += 3 ) {
    $result[] = implode('&', array_slice($items, $i, 3));
}