2012-07-31 6 views
0

preg_match 대신 preg_replace를 사용하여이 코드를 줄일 수 있습니까?이 코드를 더 짧게 만들 수 있습니까?

이메일 본문에서 인용 된 텍스트를 삭제하는 데 사용하고 있습니다. 이메일에 회신 할 때 누군가를 인용 할 때 따옴표 붙은 텍스트가 표시됩니다.

# 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"; 
    } 
} 

이 거의 작동하지만,이 첫 번째 줄 유지 "10:54 PM에 2012년 7월 30일 (월) 켜기, 사람 이름 썼다 :"

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

다른 답변이 없습니까? =/ – Draven

답변

0

아마 더 우아한 방법있다 이 일을하지만,이 일을해야합니다 (regexps '에이 올바른지 가정) :

$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

+0

@inhan : 좋은 지적. 전자 메일 주소는 정규식에 포함되도록 이스케이프되어야합니다. –

+0

@ Lèse majesté : 더 우아 할지라도 서버가 더 열악 해지지는 않습니까? – Draven

관련 문제