2014-01-21 25 views
2

好吧,所以我試圖使用正則表達式在電子郵件字符串中查找Base64圖像。正則表達式在電子郵件(Ruby)的原始體中找到Base64

特定Base64編碼字符串的最後兩行看起來是這樣的:

ublR+iVp4k0KLTdJt7jULC0uIrZY3UkJuYZ56859aK+Ftc1H4ja5ei+0a2s49M2BIt+CSBnuQc0V 
6tLIrxTsdiZ//9k= 

好了,所以這是我的正則表達式

^(?:[A-Za-z0-9+\//n]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$ 

並分解爲我自己的理智

^(?:[A-Za-z0-9+\/\n]{4})的字符串的開頭應該有四個字符(即Base64有效的和新行的那些字符)

*應當進行至少一次,但可能的次

(...)$在字符串的結尾負載...

[A-Za-z0-9+\/]{2}==給我兩個字符和兩個緩衝區

|或...

[A-Za-z0-9+\/]{3}=三個字符和一個緩衝區

|或...

[A-Za-z0-9+\/]四個大字像以前一樣


所以

當我運行

/^(?:[A-Za-z0-9+\/\n]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/\n]{4})$/.match(email.raw_body)

它只匹配到倒數第二行的末尾。

然而

當我運行

/^(?:[A-Za-z0-9+\/\n]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)$/.match(email.raw_body)

它的工作。

所以它似乎是最後或|聲明,這似乎有點缺陷。

任何人都可以提供一個建議嗎?這對快速老化的人非常有幫助。 :-)

+0

是否存在編碼塊的邊界/內容標記?如果它是一個MIME消息應該有。你有沒有嘗試過使用預製的寶石? –

+0

您是否嘗試過[*簡單搜索*](http://stackoverflow.com/questions/tagged/regex+base64?sort=votes&pageSize=50)? – HamZa

+0

嘿@theTinMan - 是的,有邊界標記。我正在使用[Thoughtbot的Griddler](https://github.com/thoughtbot/griddler)處理電子郵件,但有時附件不是附件 - 它們是內嵌圖像。 [正如你可以閱讀,](https://github.com/thoughtbot/griddler/issues/104)我也和Griddler一起奮鬥。這很有趣。 – Chris

回答

5

使用正則表達式

input.match /^(?:[A-Za-z0-9+\/]{4}\n?)*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/ 

this demo

+0

非常感謝!起初我很困惑,因爲你的演示很清晰,但是當我處理電子郵件時它不起作用 - 它與''「'匹配。但改變'*'爲'+'強制至少有一場比賽似乎有訣竅。謝謝。 – Chris

相關問題