전자 메일을 받으면이 전자 메일의 일부만 데이터베이스에 저장하고 싶습니다. 따라서 정규식을 사용하여 원하지 않는 부분을 제거합니다. 그러나 이것은 작동하지 않습니다.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
나는 끔찍한 솔루션없이 다시 시도하고 이전 코드와 함께 작동합니다. 이상한 ...
base64가 문자열을 반환하고 있는지 확인하십시오. – delboy1978uk