PHP正则表达式为$ _SERVER [“QUERY_STRING”]

时间:2017-04-07 10:53:14

标签: php regex get

我在正则表达式中匹配对。 $pairs[1]将包含=之前的部分,$pairs[2]将包含=之后的部分。

当它到达&startrow时,它应该开始跳过休息并开始制作另一对。

$query= "link=http://abcd.com&efgh&lmkn&startrow=20"

preg_match_all('/(\w+)=([^&startrow]+)/', $query, $pairs);

上述正则表达式在&处停止,但在&startrow

处停止

预期产出

$pairs[1][0] = link
$pairs[2][0] = http://abcd.com&efgh&lmkn


$pairs[1][1] =startrow
$pairs[2][1] =20

3 个答案:

答案 0 :(得分:2)

你不需要正则表达式;你需要parse_str()

$ php -a
Interactive mode enabled

php > $params = null;
php > parse_str('link=http://abcd.com&efgh&lmkn&startrow=20', $params);
php > var_dump($params);
php shell code:1:
array(4) {
  'link' =>
  string(15) "http://abcd.com"
  'efgh' =>
  string(0) ""
  'lmkn' =>
  string(0) ""
  'startrow' =>
  string(2) "20"
}

答案 1 :(得分:1)

我不知道为什么那会有意义,但假设你所要求的一切都很好并且有效,你可以做一些简单明了的事情;)

$_GET_RAW = [];
if (!empty($_SERVER['QUERY_STRING'])) {
    // split query string into key value pairs
    foreach (explode('&', $_SERVER['QUERY_STRING']) as $keyValueString) {
        // separate key and value
        list($key, $value) = explode('=', $keyValueString);
        $_GET_RAW[$key]    = $value;
    }
}

答案 2 :(得分:1)

使用以下正则表达式:

preg_match_all('~(\w+)=((?:(?!&startrow).)+)~', $str, $matches, PREG_SET_ORDER);

您可以分别捕捉这两个部分:

Array
(
    [0] => Array
        (
            [0] => link=http://abcd.com&efgh&lmkn
            [1] => link
            [2] => http://abcd.com&efgh&lmkn
        )

    [1] => Array
        (
            [0] => startrow=20
            [1] => startrow
            [2] => 20
        )

)

PHP输出:

case

PHP live demo