2013-07-05 55 views
2

我有一個PHP腳本,將我的郵件列表鏡像到基於網絡的論壇,爲了使論壇導入看起來儘可能好,我使用正則表達式來適當地捕獲電子郵件簽名&樣式。我正在用正則表達式捕捉簽名的格式有:優化正則表達式來捕捉電子郵件簽名

This is my message... 
-- 
My signature 
TheDude. 

而且

This is my message... 
--------------- 
My signature 
TheDude. 

現在,我使用這個正則表達式:

$message = preg_replace('/\s*(.+)(\s*[\r\n]-{2,}\s+.*)/s', '$1<span class="msg_footer">$2</span>', $message); 

它的工作原理,但我的後一些快速測試,我意識到這個正則表達式是真的是慢。

我不是那麼好的正則表達式,有人可以看看正則表達式&告訴我如何優化它&讓它快嗎?

+0

是您的標誌,破折號和兩行到文件末尾的標準? –

回答

3

您正在使用正則表達式處理整個消息,這肯定是緩慢的。更好的選擇是使用適當的編程邏輯來處理消息。例如,逐行瀏覽消息並測試每行是否符合「開始簽名」正則表達式。如果沒有,則將其添加到保存實際消息的數組或字符串中。如果它匹配,則將其餘消息添加到頁腳。

如果您認爲用戶將在郵件中間使用與您的正則表達式匹配的行,您可能還想從底部開始而不是頂部。

+1

我想出了一個正則表達式,但由於你的問題是速度,丹尼爾的建議可能是一個好主意。 –

0

假設一個簽名與至少兩個-在行的開頭開始,並用\r\n\r\n一次或多次結束,試試這個:

$message = preg_replace(
       '/^(-{2,})(?=(?:\r?\n|\r)+)/m', 
       '<span class="msg_footer">$1</span>', 
       $message 
      );