Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从最新的php线程中删除旧电子邮件_Php_Email_Imap - Fatal编程技术网

从最新的php线程中删除旧电子邮件

从最新的php线程中删除旧电子邮件,php,email,imap,Php,Email,Imap,我的结构如下: $email = array( 4 => array( 4, //contains email messages from uids 4 + 3 + 2 3, //contains email messages from uids 3 + 2 2 //contains email message from uid 2 )); 我想完成的是: $email = array( 4 =&

我的结构如下:

$email = array(
      4 => array(
          4,  //contains email messages from uids 4 + 3 + 2
          3,  //contains email messages from uids 3 + 2
          2   //contains email message from uid 2
));
我想完成的是:

$email = array(
      4 => array(
          4,  //contains email messages from uid 4
          3,  //contains email messages from uid 3
          2   //contains email message from uid 2
));
我的想法是,我需要从堆栈的末尾抓取消息,递归地向上遍历树,并对内容执行
str_replace
,只保留特定电子邮件中的内容。我不知道该怎么做

而且

我注意到,在某些情况下,例如在查看消息uid 4时,它会说:

2013年7月19日下午3:28,jonathan@somedomain.com写道:

有时它会显示新消息,而不是旧消息,然后显示新消息的签名:

乔纳森

{{这里有新消息}

史蒂夫

{{旧消息}}

乔纳森

谢谢, 史蒂夫

短跑

我真的不知道如何实现这一点。我希望我的问题措辞正确,并提供了足够的信息以提供帮助。

你的意思是这样吗

<?php

$threads = array(
    'baz bar foo' => array(
        'baz bar foo',
        'bar foo',
        'foo',
    ),
);

$new_threads = array();

foreach ($threads as $key => $thread) {

    $tmp = array();
    $prev = null;

    foreach (array_reverse($thread) as $email) {
        switch (true) {
            case $prev === null;
            case ($pos = strrpos($email, $prev)) === false:
                $tmp[] = $email;
                $prev = $email;
                break;
            default:
                $tmp[] = rtrim(substr($email, 0, $pos));
                $prev = $email;
        }
    }

    $new_threads[$key] = array_reverse($tmp);

}

var_dump($new_threads);
它能工作!


这看起来很棒,我将对它进行测试,但是对于添加内容的电子邮件应用程序,我该怎么做,比如“在这一天乔纳森写道:”有这么多的变化,我觉得不可能实现我想要的。你可以使用PCRE功能来实现你的目的。这就是问题所在。我感觉需要正则表达式。我没有使用正则表达式的经验。我可以自己尝试一下,但这需要非常长的时间,而且很可能是不对的。我很期待学习正则表达式,但现在我不能这样做。你能帮忙吗?是否有一种方法可以替换除消息之外的所有内容,或者我需要找到所有不同的变体,并针对所有变体执行正则表达式。我在这一点上迷路了。你能解释一下他们什么时候把信息放在右箭头上的吗。抱歉,我在手机上,因此没有右箭头符号。我将查找应用程序添加到电子邮件中的其他类型的内容,以便我们能够完全完成此操作。我非常感谢这项工作。从邮件中删除回复上下文几乎是不可能的。有说格式和风格,没有标准,你能做的最好的是一些启发式。我知道。我正在尽我所能去做尽可能多的启发。这是非常困难的,因为我现在不知道或者没有时间学习正则表达式,我讨厌向别人寻求帮助。@当然,你能为下面的内容添加正则表达式吗:换行符然后“引用”jonathan@someemail.com:“然后换行,然后右箭头括号中的前一封电子邮件。
<?php

$msg1 = <<< EOD
Steve,

old message

Jonathan
EOD;

$msg2 = <<< EOD
Jonathan,

new message

On Jul 19, 2013, at 3:28 PM, jonathan@somedomain.com wrote:
{$msg1}

Thanks, Steve
EOD;


$threads = array(
    $msg2 => array(
        $msg2,
        $msg1,
    ),
);


$quote = 'On [a-z]{3} \\d{1,2}, \\d{4}, at \\d{1,2}:\\d{2} (?:AM|PM), [^@\\s]++@[^\\s]++ wrote:';

$new_threads = array();

foreach ($threads as $key => $thread) {

    $tmp = array();
    $prev = null;

    foreach (array_reverse($thread) as $email) {
        if ($prev === null) {
            $tmp[] = $prev = $email;
        } else {
            $pattern = sprintf('/(?:%s|%s)[\\s]*+/i', $quote, preg_quote($prev));
            $tmp[] = $prev = preg_replace($pattern, '', $email);
        } 
    }

    $new_threads[$key] = array_reverse($tmp);

}

foreach ($new_threads as $key => $value) {
    echo "[all]\n{$key}\n\n";
    echo "[msg2]\n{$value[0]}\n\n";
    echo "[msg1]\n{$value[1]}\n\n";
}