2012-05-28 27 views
0

首先,我在正則表達式中不太好,所以在這裏可能會有錯誤。我得到了下面的正則表達式我創建:正則表達式在Expresso中工作,但不在PHP中(使用preg_match_all)

`(?:\\&|[^&])*` (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_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] => 
     ) 

) 
+1

你想要解析的字符串看起來像是url的GET部分。如果是這樣的話,你可能想嘗試PHP的'parse_str()'函數http://ca2.php.net/manual/en/function.parse-str.php – dnagirl

+0

@dnagirl parse_str thing \&是一個新值,不要逃避它。 –

+0

@DavidBélanger我已經添加了一個正確使用'parse_str'解析給定輸入字符串的答案,因爲'\&'可以正確編碼。 – nickb

回答

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 
) 
*/ 
+0

更好的主意,更好的正則表達式。 +1 – DaveRandom

+0

請不要忘記提及這樣一個事實,即由於PHP在將字符串傳遞給PCRE之前對字符串進行插值的方式,反斜槓需要雙重轉義,因爲這是原始問題。 – DaveRandom

+0

謝謝,比我原來的代碼工作得更好,因爲在每行之後沒有看到空值。 Thakns! –

1

我會願意打賭的問題是,你忘記添加到補償的事實需要額外的反斜線那\也PHP中的轉義字符。

試試這個:

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

編輯

事實上,這就是問題所在 - See it working

+0

感謝您給我的解決方案,你是對的,但bsdnoobz有一個改善我的需要!謝謝。 –

1

我相信DaveRandom是正確的,但是這裏是另一種解析給定字符串而不使用正則表達式的方法。

它只是將\&編碼爲%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" 
} 

我不知道這是否是必要的,但你可以與array_map所得陣列的每個值運行urldecode

編輯:

如果你想保留符號逃跑了,你可以簡單地用其逃逸更換符號,像這樣:

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

這產生了:

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

這不是個壞消息,但不幸的是'str_replace('\'','%26',$ str);'方法可能太簡單了。如果有人使用反斜槓作爲轉義字符,通常會使用雙反斜線來指定一個字符,而簡單的'str_replace()'不能解決這個問題。您仍然需要regex來處理'\&'替換 - 但是這種方法仍然具有優點,因爲它將解析爲關聯的鍵/值數組,而不是留下需要進一步解析的數據。 – DaveRandom

+0

這是一種魅力,但它不會讓caracter轉義。但是,您有權獲得+1 –

+0

我編輯了我的答案以重新逃避&符。 – nickb

相關問題