2009-09-05 66 views
0

我想在下面的響應中做一個「preg match all」來獲得所有的二進制數據。我已經嘗試過幾乎所有可以想象的事情,並且爲了我的生活,無法得到任何東西。PHP正則表達式(REGEX)多部分MIME(NOT-EMAIL)

我希望它會是因爲做這樣的事情非常簡單:

preg_match_all("#\n\n(.*)\n--$boundary#",$body,$matches); 

但我不能得到任何東西。我也試過其他的東西。 \ r \ n |我是你 - 我因爲某種原因無法得到它。

這裏是一個僞響應不包括標題:

--boundary 
content-type:image/jpeg 

<binary data> 
--boundary 
content-type:image/jpeg 

<binary data> 
--boundary 
content-type:image/jpeg 

<binary data> 
--boundary 

遺憾的是二進制數據不與< &封閉式>它只是有特殊字符的原始數據在多條線路的過程中...

另外:我認爲問題在於顯示的實際二進制數據,因爲當我運行preg匹配所有上面的信息它工作得很好,但是當我嘗試它的實際數據,所有的二進制數據廢話,它不起作用。

+0

也可以請你在這裏發佈你的示例,而不是網址。未來,當這個鏈接的內容長期被改變時,其他人可能會偶然發現你的問題。 – 2009-09-06 00:05:42

+0

我提出了修改建議。 – Mickey 2009-09-06 00:28:45

+0

我試過你提供的數據的正則表達式,它的工作。嘗試回顯變量$ boundary來檢查你的期望。 – 2009-09-06 00:42:44

回答

1

或者,您可以使用explode()進行解析,這應該快得多,它不會太複雜,並且它會爲您提供標頭信息if你想要它:

<?php 

$body = file_get_contents('output.txt'); 
$boundary = '__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__'; 
$parts = explode("--$boundary", $body); 
array_shift($parts); # delete up to the first boundary 
array_pop($parts); # delete after the last boundary 

$binaries = array(); 
foreach($parts as $part) { 
    list($header, $binary) = explode("\n\n", $part, 2); 
    $binaries[] = $binary; 
}  

print_r($binaries); 
0

我沒有關於正則表達式的答案,但是您看過Zend_Mime嗎?

+0

是的,我有過去,zend的東西對我來說是陌生的,但謝謝你的提示。 – Mickey 2009-09-05 23:53:05

+0

那麼如果你不喜歡學習如何使用Zend Framework,你也可以看看Zend_Mime_Decode類。我想splitMime函數可能對你很有幫助。這裏的鏈接:http://framework.zend.com/code/browse/~raw,r=9280/Zend_Framework/trunk/library/Zend/Mime/Decode.php – 2009-09-06 00:03:36

+0

該類正在使用類似的方法我已經成功了。我只想看看我是否可以用一個preg_match_all語句解析。 – Mickey 2009-09-06 00:25:26

1

對於我提供的數據,你表達的似乎很好。我拉下你的output.php,並將其更名爲output.txt中,然後運行這個腳本:

<?php 

$body = file_get_contents('output.txt'); 
$boundary = '__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__'; 
preg_match_all("#\n\n(.*)\n--$boundary#",$body,$matches); 
print_r($matches); 

似乎已經工作得很好,也就是說,它打印此:

Array 
(
    [0] => Array 
     (
      [0] => 

    [body] => 
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__ 
      [1] => 

ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__ 
      [2] => 

ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__ 
      [3] => 

ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__ 
      [4] => 

ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
--__NEXT_PART_gc0p4Jq0M2Yt08jU534c0p__ 
     ) 

    [1] => Array 
     (
      [0] =>  [body] => 
      [1] => ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
      [2] => ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
      [3] => ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
      [4] => ÿ(RAW IMAGE DATA CONTINUES OVER MULTIPLE LINES starts with "ÿ" ends with "ÿÙ")ÿÙ 
     ) 

) 

貌似$比賽[1]包含你之後的二進制數據列表。

+0

即時通訊仍然得到兩個空陣列:( – Mickey 2009-09-06 00:41:00

+0

哦,狗屎...我想我找到了什麼是造成這個問題.. 我什麼時候得到什麼,當我運行這個腳本本地在我的Windows XP電腦上使用瓦特,但是當我運行它我的Linux服務器它的工作原理很好。任何想法? – Mickey 2009-09-06 00:44:20

+0

哦,你只應該在[body] =>數組中的東西上運行preg匹配//但除此之外,我想它工作得很好,但不在窗戶上...... hmm – Mickey 2009-09-06 00:50:35

0

好了,好了,我不是那麼熟悉PHP正則表達式...

考慮你正在嘗試做的,點百搭換行符s開關應該工作。使用這個正則表達式似乎在我的結尾:

/<binary data>\r\n(.*?)\r\n--simple boundary/s 

* *?應該是非貪婪的,所以它只會吞噬儘可能多的以匹配它看到的第一個簡單的邊界文本字符串。

您的行結束符可能與我的不同(我在Windows機器上),因此您可能必須啓動一個十六進制編輯器才能看到<binary data>內容前後應匹配的內容。

+0

感謝您的提示,我會盡力回覆。 在看到JasonWoof能夠使它工作之後,我將問題縮小到操作系統上,腳本正在運行,而不是正則表達式本身,它在Linux機器上運行得很好。 – Mickey 2009-09-06 00:54:10

+0

很高興聽到您縮小了它down – 2009-09-06 02:00:00

2

\n是平臺相關的。推測你的數據是一個http請求或電子郵件?在這種情況下,換行符將爲\r\n,因此您需要測試該代碼而不是

+0

我不知道,謝謝你的提示,所以\ r \ n是非常普遍的嗎? – Mickey 2009-09-06 16:47:51

+0

不,但它是大多數基於網絡的協議(http和郵件)的標準。 – troelskn 2009-09-06 19:02:58