PHP preg_replace 没有硬编码就无法工作
PHP preg_replace doesn't work without hardcode
当我收到一封电子邮件时,我只想将这封电子邮件的一部分保存在数据库中,因此,我使用正则表达式删除了我不想要的部分。但是,这不起作用。
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", '', $text);
echo($gmail . "<br>");
return $gmail;
break;
如果
$body = "test
2017-09-11 11:55 GMT+02:00 XXX :
> frgthyjuki";
echo($text);和回声($gmail);都给我 :
test
2017-09-11 11:55 GMT+02:00 XXX :
> frgthyjuki
但是,如果我在 emailToMessage() 中(在 $body = checkSubtype($structure, $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", '', $text);
echo($gmail . "<br>");
return $gmail;
break;
echo($text);会给
test
2017-09-11 11:55 GMT+02:00 XXX :
> frgthyjuki
和回声($gmail);将给出:
test
为什么只有当变量是硬编码时它才有效?我该怎么做才能解决它?
更新
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;
}
更新 2
我用 Thunderbird 和 Orange 进行了测试。
我不使用 Thunderbird(我在线检查我的 RegEx,它是正确的)但它适用于 Orange。
case "orange":
return preg_replace("/s*>(?:\s(?:.)*)*/i", '', $text);
break;
我真的不懂...
更新 3
我在没有可怕的解决方案的情况下重试,它适用于以前的代码。
很奇怪...
这是一个糟糕的解决方案,但它确实有效...
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", '', $step1);
return preg_replace("/#/i", ' ', $step2);
break;
当我收到一封电子邮件时,我只想将这封电子邮件的一部分保存在数据库中,因此,我使用正则表达式删除了我不想要的部分。但是,这不起作用。
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", '', $text);
echo($gmail . "<br>");
return $gmail;
break;
如果
$body = "test
2017-09-11 11:55 GMT+02:00 XXX :
> frgthyjuki";
echo($text);和回声($gmail);都给我 :
test
2017-09-11 11:55 GMT+02:00 XXX :
> frgthyjuki
但是,如果我在 emailToMessage() 中(在 $body = checkSubtype($structure, $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", '', $text);
echo($gmail . "<br>");
return $gmail;
break;
echo($text);会给
test
2017-09-11 11:55 GMT+02:00 XXX :
> frgthyjuki
和回声($gmail);将给出:
test
为什么只有当变量是硬编码时它才有效?我该怎么做才能解决它?
更新
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;
}
更新 2
我用 Thunderbird 和 Orange 进行了测试。
我不使用 Thunderbird(我在线检查我的 RegEx,它是正确的)但它适用于 Orange。
case "orange":
return preg_replace("/s*>(?:\s(?:.)*)*/i", '', $text);
break;
我真的不懂...
更新 3
我在没有可怕的解决方案的情况下重试,它适用于以前的代码。 很奇怪...
这是一个糟糕的解决方案,但它确实有效...
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", '', $step1);
return preg_replace("/#/i", ' ', $step2);
break;