2011-06-17 50 views
1

我使用PHP/CURL在2個緊密連接的代碼點火器之間自動調用。PHP CURL使用preg_match解析多個set-cookie標頭

代碼點火器返回2 set-cookie頭,一個用於與實際會話數據,一個用於與空會話不安全的連接安全cookie ...

Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path=/ 
Set-Cookie: overshare=BdHJPVt...STsCxnMBj; path=/; secure 

我一直在試圖解析安全cookie(這兩個站點都在同一個域中,所以如果我通過CURL獲取更新的會話信息,我應該更新客戶端cookie,就好像他們直接撥打電話一樣)

我目前使用以下來解析cookie:

preg_match('/Set-Cookie: (.*)\b/', $Head, $Cookies); 

這使我在$Cookies

Array 
(
    [0] => Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path 
    [1] => overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path 
) 

但這只是比較第一組-cookie頭。我的正則表達式技巧很差 - 我怎麼能匹配第二個標題?

回答

7

假設$Head是一個包含所有cookie標頭的單個字符串,您正在尋找preg_match_all()preg_match()找到第一場比賽後停止。

preg_match_all()匹配的整個字符串將在$Cookies[0]。你的子模式匹配將在$Cookies[1]

$Head = <<<HEAD 
Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path=/ 
Set-Cookie: overshare=BdHJPVt...STsCxnMBj; path=/; secure 
HEAD; 

preg_match_all('/Set-Cookie: (.*)\b/', $Head, $Cookies); 

print_r($Cookies); 

產生

Array 
(
    [0] => Array 
     (
      [0] => Set-Cookie: overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path 
      [1] => Set-Cookie: overshare=BdHJPVt...STsCxnMBj; path=/; secure 
     ) 

    [1] => Array 
     (
      [0] => overshare=a%3A0%3A%7B%7D; expires=Thu, 17-Jun-2010 05:09:32 GMT; path 
      [1] => overshare=BdHJPVt...STsCxnMBj; path=/; secure 
     ) 

) 

另外,你的通配符(.*)是默認的貪婪,所以它可能會消耗兩個串在一起,如果標題沒有在不同的行。如果是這樣,請嘗試(.*?)使其不合格。

+0

謝謝 - 特別是發現貪婪的比賽。 – Basic 2011-06-17 12:31:05