【问题标题】:Removing old emails from newest thread php从最新线程 php 中删除旧邮件
【发布时间】:2013-07-20 20:51:31
【问题描述】:

我有以下结构:

$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 时,它会显示如下内容:

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

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

乔纳森,

{{这里有新消息}}

史蒂夫,

{{旧消息}}

乔纳森

谢谢, 史蒂夫

破折号破折号

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

【问题讨论】:

    标签: php email imap


    【解决方案1】:

    你的意思是这样吗?

    <?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 函数。php.net/manual/en/ref.pcre.php
    • 这就是问题所在。我感觉需要正则表达式。我没有使用正则表达式的经验。我可以自己尝试一下,但这需要很长时间,而且很可能不会是正确的。我对学习正则表达式充满了期待,但我现在做不到。你能帮忙吗?有没有办法替换除消息之外的所有内容,还是我需要找到所有不同的变体并对所有变体执行正则表达式。我现在迷路了。
    【解决方案2】:

    有效! http://ideone.com/qXysl3

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

    【讨论】:

    • 你能解释他们何时将消息放在右箭头中。抱歉,我在手机上,所以没有右箭头符号。
    • 我将找出应用程序添加到电子邮件中的其他类型的内容,以便我们可以完全完成这项工作。我非常感谢这项工作。
    • 几乎不可能从消息中删除回复上下文。有说格式和样式,没有标准,你能做的最好的就是一些启发式。
    • 我知道。我正在尽我所能做尽可能多的启发式方法。这非常困难,因为我目前不知道或没有分配时间来学习正则表达式,而且我讨厌向人们寻求帮助。
    • @CertaiN,您能否为以下内容添加正则表达式:换行,然后“引用 jonathan@someemail.com:”,然后换行,然后在右箭头括号中发送电子邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2017-08-31
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多