0

首先,我的正则表达式不是很好,所以这里可能有错误。我得到了我创建的以下正则表达式模式:

`(?:\\&|[^&])*` (PHP : `/(?:\\&|[^&])*/s`) 

解析以下字符串的类型:

hfghfg=hfghfg&gfdgdf=4343543&gfdgfdgfd=fsdfds\&hghg999

浓缩咖啡给我这个:

hfghfg=hfghfg
NULL
gfdgdf=4343543
NULL
gfdgfdgfd=fsdfds\&hghg999
NULL

所以它的作用与explode('&', $String)但 if相同\& is found,它不会削减。

但是在 PHP 中,preg_match_allpreg_match我这个:

preg_match_all('/(?:\\&|[^&])*/s', 
                     implode('', $this->Grecko->Input->Server('argv')), 
                     $Args, PREG_PATTERN_ORDER);
print_r($Args);

Array
(
    [0] => Array
        (
            [0] => hfghfg=hfghfg&gfdgdf=4343543&gfdgfdgfd=fsdfds\&hghg999
            [1] => 
        )

)
4

3 回答 3

2

我认为你需要的是preg_split()而不是preg_match_all().

$str = 'hfghfg=hfghfg&gfdgdf=4343543&gfdgfdgfd=fsdfds\&hghg999';
$res = preg_split('/(?<!\\\)&/', $str);

print_r($res);

/*
Array
(
  [0] => hfghfg=hfghfg
  [1] => gfdgdf=4343543
  [2] => gfdgfdgfd=fsdfds\&hghg999
)
*/
于 2012-05-28T14:13:45.690 回答
1

我敢打赌,问题在于您忘记添加额外的反斜杠以补偿\PHP 中的转义字符这一事实。

试试这个:

preg_match_all('/(?:\\\\&|[^&])*/s', implode('', $this->Grecko->Input->Server('argv')), $Args, PREG_PATTERN_ORDER);
print_r($Args);

编辑

确实这就是问题所在 -看到它工作

于 2012-05-28T14:10:26.430 回答
1

我相信 DaveRandom 是正确的,但是这是一种不使用正则表达式来解析给定字符串的替代方法。

它只是对\&as进行编码%26,这是与符号的 URL 编码值。然后,它用于parse_str解析输入字符串。

$str = "hfghfg=hfghfg&gfdgdf=4343543&gfdgfdgfd=fsdfds\&hghg999";

// Properly encode the ampersand
$str = str_replace( '\&', '%26', $str);

// Parse the string
parse_str( $str, $arr);

var_dump( $arr);

输出:

array(3) {
  ["hfghfg"]=>
  string(6) "hfghfg"
  ["gfdgdf"]=>
  string(7) "4343543"
  ["gfdgfdgfd"]=>
  string(14) "fsdfds&hghg999"
}

我不确定是否有必要,但您可以urldecode使用array_map.

编辑:

如果你想保持 & 符号转义,你可以简单地用它的转义替换 & 符号,如下所示:

array_walk( $arr, 
    function( &$str) { 
        $str = str_replace( '&', '\&', $str);
});

这产生:

array(3) {
  ["hfghfg"]=>
  string(6) "hfghfg"
  ["gfdgdf"]=>
  string(7) "4343543"
  ["gfdgfdgfd"]=>
  string(15) "fsdfds\&hghg999"
}
于 2012-05-28T14:22:04.537 回答