2017-09-14 6 views
0

전자 메일을 받으면이 전자 메일의 일부만 데이터베이스에 저장하고 싶습니다. 따라서 정규식을 사용하여 원하지 않는 부분을 제거합니다. 그러나 이것은 작동하지 않습니다.PHP preg_replace가 하드 코드없이 작동하지 않습니다

function emailToMessage($inbox, $emails){ 
$messages = []; 

foreach ($emails as $email_number){ 

    # $overview contient les infos du mail 
    $overview = imap_fetch_overview($inbox,$email_number,0); 
    $headerInfos = imap_headerinfo($inbox,$email_number); 
    $mailHeader = imap_fetchheader($inbox,$email_number); 
    $structure = imap_fetchstructure($inbox,$email_number); 
    $subject = (isset($overview[0]->subject)) ?$overview[0]->subject : 'Pas de sujet'; 
    $sender = $headerInfos->from[0]->mailbox . "@" . $headerInfos->from[0]->host; 
    $body = imap_fetchbody($inbox,$email_number,1); 

    $body = checkSubtype($structure, $body); // decode if the transfert encoding is base64 and change encoding to utf8 
    $text = cleanMail($body, $mailHeader); 

    #conversion de udate en format pouvant etre inséré dans mySql 
    $mailDateAndTime = date("Y-m-d H:i:s", $overview[0]->udate); 

    $message = [ 
     'title'  => $subject, 
     'text'  => $text, 
     'id_sender' => $sender, 
     'mailDateAndTime' => $mailDateAndTime, 
    ]; 

    $messages[] = $message; 
    } 
return $messages; 
} 

function cleanMail($text, $mailHeader){ 
    $clientMail = checkMailClient($mailHeader); 

switch($clientMail){ 
    case "gmail": 
    echo($text . "<br>"); 
    $gmail = preg_replace("/\s+[0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]{2}:[0-9]{2}\s+GMT\+[0-9]{2}:[0-9]{2}\s+(.)*\s+:(?:\s(.)*)*/i", '$1', $text); 
    echo($gmail . "<br>"); 
    return $gmail; 
    break; 

$body = "test 

2017-09-11 11:55 GMT+02:00 XXX : 

> frgthyjuki"; 

에코 ($ 텍스트)의 경우; 와 echo ($ gmail); 모두 줘 :

테스트

2017년 9월 11일 11:55 GMT + 02 : 00 XXX :

> frgthyjuki

그러나, 나는 $ 텍스트를 선언하는 경우 emailToMessage() ($ body = checkSubtype ($ 구조체, $ body)와 $ text = cleanMail ($ body, $ mailHeader); 사이) 또는 cleanMail()에서 작동합니다.

switch($clientMail){ 
    $text = "test 

2017-09-11 11:55 GMT+02:00 XXX : 

> frgthyjuki"; 

    case "gmail": 
    echo($text . "<br>"); 
    $gmail = preg_replace("/\s+[0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]{2}:[0-9]{2}\s+GMT\+[0-9]{2}:[0-9]{2}\s+(.)*\s+:(?:\s(.)*)*/i", '$1', $text); 
    echo($gmail . "<br>"); 
    return $gmail; 
    break; 

echo ($ text); 줄 것이다

시험

2017년 9월 11일 그리니치 표준시 11시 55분 + 02 : 00 XXX :

> frgthyjuki

에코의 ($의 Gmail); 줄 것이다 :

테스트 변수가 하드 코딩 할 때

이 왜에만 작동한다? 무엇을 해결할 수 있습니까?

UPDATE

function checkSubtype($structure, $body){ 
    $subtype = strtolower($structure->subtype); 

    if($subtype == "alternative") { 
     $encoding = $structure->parts[0]->parameters[0]->value; 
     $encoding = strtolower($encoding); 
     $transferEncoding = $structure->parts[0]->encoding; 

     $body = checkIfBase64($body, $transferEncoding); 
     $body = quoted_printable_decode($body); 
     $body = changeToUTF8($body, $encoding); 
    } else { 
     $transferEncoding = $structure->encoding; 
     $body = checkIfBase64($body, $transferEncoding); 
    } 
    return $body; 
} 

-

function checkIfBase64($text, $transferEncoding){ 
    if($transferEncoding == "3"){ 
     $text = base64_decode($text); 
    } 
    return $text; 
} 

function changeToUTF8($text, $encoding){ 
    if($encoding != "utf-8" && $encoding != 'utf8'){ 
    $text = utf8_encode($text); 
    } 
    return $text; 
} 

UPDATE 2

나는 썬더 버드와 오렌지 테스트.

썬더 버드에서 작동하지 않습니다. 온라인으로 내 RegEx를 확인합니다.하지만 오렌지색과 호환됩니다.

case "orange": 
return preg_replace("/s*>(?:\s(?:.)*)*/i", '$1', $text); 
break; 

내가 정말 이해가 안 ...

UPDATE 3

나는 끔찍한 솔루션없이 다시 시도하고 이전 코드와 함께 작동합니다. 이상한 ...

+2

base64가 문자열을 반환하고 있는지 확인하십시오. – delboy1978uk

답변

0

그것은 끔찍한 해결책이지만 작동합니다 ...

case "gmail": 
    $step1 = preg_replace("/\s+/i", '#', $text); 
    $step2 = preg_replace("/#*[0-9]{4}-[0-9]{2}-[0-9]{2}#+[0-9]{2}:[0-9]{2}#+GMT\+[0-9]{2}:[0-9]{2}#+(.)*#*:(?:#(.)*)*/i", '$2', $step1); 
    return preg_replace("/#/i", ' ', $step2); 
    break;