0

まず、私は正規表現があまり得意ではないので、ここに間違いがあるかもしれません。私が作成した次の正規表現パターンを取得しました:

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

次の文字列の種類を解析するには:

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

エスプレッソはこれをくれ :

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

したがって、 と同じexplode('&', $String)ですが、 の場合\& is foundはカットされません。

しかし、PHPでは、preg_match_allこれpreg_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 は正しいと思いますが、正規表現を使用せずに指定された文字列を解析する別の方法を次に示します。

アンパサンドの URL エンコード値である\&asをエンコードするだけです。%26次に、 を使用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 に答える