2012-07-31 150 views
0

是否可以使用preg_replace而不是preg_match來縮短此代碼?我可以縮短這段代碼嗎?

我使用它來刪除電子郵件正文中的引用文本。 當您回覆電子郵件時引用某人的引用文字。

# Get rid of any quoted text in the email body 
# stripSignature removes signatures from the email 
# $body is the body of an email (All headers removed) 
$body_array = explode("\n", $this->stripSignature($body)); 
$new_body = ""; 
foreach($body_array as $key => $value) 
{ 
    # Remove hotmail sig 
    if($value == "_________________________________________________________________") 
    { 
     break; 

    # Original message quote 
    } 
    elseif(preg_match("/^-*(.*)Original Message(.*)-*/i",$value,$matches)) 
    { 
     break; 

    # Check for date wrote string 
    } 
    elseif(preg_match("/^On(.*)wrote:(.*)/i",$value,$matches)) 
    { 
     break; 

    # Check for From Name email section 
    } 
    elseif(preg_match("/^On(.*)$fromName(.*)/i",$value,$matches)) 
    { 
     break; 

    # Check for To Name email section 
    } 
    elseif(preg_match("/^On(.*)$toName(.*)/i",$value,$matches)) 
    { 
     break; 

    # Check for To Email email section 
    } 
    elseif(preg_match("/^(.*)$toEmail(.*)wrote:(.*)/i",$value,$matches)) 
    { 
     break; 

    # Check for From Email email section 
    } 
    elseif(preg_match("/^(.*)$fromEmail(.*)wrote:(.*)/i",$value,$matches)) 
    { 
     break; 

    # Check for quoted ">" section 
    } 
    elseif(preg_match("/^>(.*)/i",$value,$matches)) 
    { 
     break; 

    # Check for date wrote string with dashes 
    } 
    elseif(preg_match("/^---(.*)On(.*)wrote:(.*)/i",$value,$matches)) 
    { 
     break; 

    # Add line to body 
    } 
    else { 
     $new_body .= "$value\n"; 
    } 
} 

這幾乎工作,但它一直在第一線「在星期一,2012年7月30日在下午10時54分,人名稱寫道:」

$body = preg_replace('/(^\w.+:\n)?(^>.*(\n|$))+/mi', "", $body); 
+0

沒有其他答案? =/ – Draven 2012-07-31 15:35:19

回答

0

有可能是一個更優雅的方式這樣做,但這應該工作(假定的正則表達式是正確的):

$search = array(
    "/^-*.*Original Message.*-*/i", 
    "/^On.*wrote:.*/i", 
    "/^On.*$fromName.*/i", 
    "/^On.*$toName.*/i", 
    "/^.*$toEmail.*wrote:.*/i", 
    "/^.*$fromEmail.*wrote:.*/i", 
    "/^>.*/i", 
    "/^---.*On.*wrote:.*/i" 
); 


$body_array = explode("\n", $this->stripSignature($body)); 
$body = implode("\n", array_filter(preg_replace($search, '', $body_array))); 

// or just 

$body = str_replace(
    array("\0\n", "\n\0"), '', preg_replace($search, "\0", $body) 
); 

編輯:作爲inhan指出,在電子郵件地址的點(和潛在other special characters)需要在插入模式之前使用preg_quote()進行轉義。

+1

請注意電子郵件地址中的點。一旦它變成正則表達式,它們可能會被解釋爲「任何字符」。 – inhan 2012-07-31 03:49:16

+0

@inhan:好點。這些電子郵件地址應該可以被轉義以包含在正則表達式中。 – 2012-07-31 03:52:34

+0

@Lèsemajesté:儘管它更優雅不會讓服務器更難工作嗎? – Draven 2012-07-31 04:23:44