PHP – 类似Gmail的电子邮件内容分离

我正在构建一个票务系统,但我不想把其中一个消息

********************************************************************************************************************************************************* **

Gmail倾向于使用“引用文字”做出相当不错的主意.有没有人知道任何预制的脚本或方法很容易做到这一点?我正在尝试将他们的回复传回我们的系统.

谢谢,
黑色的小乳牛

我认为你需要像我的全数组diff功能:
/** 
        Full Array Diff implemented in pure php,written from scratch. 
        Copyright (C) 2011 Andres Morales <yo@kijote.com.ar> 

        This program is free software; you can redistribute it and/or 
        modify it under the terms of the GNU General Public License 
        as published by the Free Software Foundation; either version 2 
        of the License,or (at your option) any later version. 

        This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
        GNU General Public License for more details. 

        You should have received a copy of the GNU General Public License 
        along with this program; if not,write to the Free Software 
        Foundation,Inc.,59 Temple Place - Suite 330,Boston,MA  02111-1307,USA. 

        http://www.gnu.org/licenses/gpl.html 

        About:
        I needed a function to compare a email and its response but array_diff()
        does not cover my expectations. So I reimplement a full array diff function.
        You can use it directly in your code and adopt to your needs.

        Contact:
        yo@kijote.com.ar <Andres Morales> 
**/ 
function farray_diff($array1,$array2){
        $out = array();
        $max_arr = count($array1) > count($array2)? count($array1) : count($array2);

        $i = 0;
        $j = 0;

        while($i < $max_arr && $j< $max_arr){
            if($array1[$i] == $array2[$j]){
                array_push($out,$array1[$i]);
            }
            else {
                if(in_array($array1[$i],array_slice($array2,$j))){
                    for($k = $j; $k<$max_arr; $k++){
                        if($array1[$i]==$array2[$k]){
                            array_push($out,$array2[$k]);
                            $j = $k;
                            break;
                        }
                        else{
                            array_push($out,array('o' => '','n' => $array2[$k]));
                        }
                    }
                }
                elseif(in_array($array2[$j],array_slice($array1,$i))){
                    for($k = $i; $k<$max_arr; $k++){
                        if($array2[$j]==$array1[$k]){
                            array_push($out,$array1[$k]);
                            $i = $k;
                            break;
                        }
                        else {
                            array_push($out,array('o' => $array1[$k],'n' => ''));
                        }
                    }
                }
                else{
                    if(!empty($array1[$i]))
                        array_push($out,array('o' => $array1[$i],'n' => $array2[$j]));
                    else
                        array_push($out,'n' => $array2[$j]));
                }
            }
            $i++; $j++;
        }
        return $out;
    }

因此,您可以像在以下示例中一样使用它:

$str1 = "This is a simple text that can you reply,so can you do it?";
$str2 = "I response in your text: This is a simple text (no so simple) that can be replied,so can you do it? Yes,I can!";
// Printing the full array diff of single space exploded strings
print_r(farray_diff(explode(' ',$str1),explode(' ',$str2)));

返回:

Array
(
    [0] => Array
        (
            [o] => 
            [n] => I
        )

    [1] => Array
        (
            [o] => 
            [n] => response
        )

    [2] => Array
        (
            [o] => 
            [n] => in
        )

    [3] => Array
        (
            [o] => 
            [n] => your
        )

    [4] => Array
        (
            [o] => 
            [n] => text:
        )

    [5] => This
    [6] => is
    [7] => a
    [8] => simple
    [9] => text
    [10] => Array
        (
            [o] => 
            [n] => (no
        )

    [11] => Array
        (
            [o] => 
            [n] => so
        )

    [12] => Array
        (
            [o] => 
            [n] => simple)
        )

    [13] => that
    [14] => can
    [15] => Array
        (
            [o] => 
            [n] => be
        )

    [16] => Array
        (
            [o] => 
            [n] => replied,)

    [17] => Array
        (
            [o] => 
            [n] => so
        )

    [18] => Array
        (
            [o] => 
            [n] => can
        )

    [19] => you
    [20] => Array
        (
            [o] => reply,[n] => 
        )

    [21] => Array
        (
            [o] => so
            [n] => 
        )

    [22] => Array
        (
            [o] => can
            [n] => 
        )

    [23] => Array
        (
            [o] => you
            [n] => 
        )

    [24] => do
    [25] => it?
    [26] => Array
        (
            [o] => 
            [n] => Yes,)

    [27] => Array
        (
            [o] => 
            [n] => I
        )

    [28] => Array
        (
            [o] => 
            [n] => can!
        )

它就像一个简单的差异,但是没有“”和“ – ”,在用“o”(对于旧)和“n”(对于新的)数组键进行简单解析之后,它们都已被替换.并且您可以使用以下函数来解析结果:

function format_response($diff_arr){
    $new = false;
    echo '<span class="old">';
    foreach($diff_arr as $item)
    {
        $content = '';
        if (!is_array($item)){
            $new = false;
            $content = $item;
        }
        else
            if (empty($item['o']) && !empty($item['n'])){
                $new = true;
                $content = $item['n'];
            }

        if($old_new != $new){
            if($new)
                echo '</span><span class="new">';
            else
                echo '</span><span class="old">';
        }

        echo $content . (!empty($content)?' ':'');

        $old_new = $new;
    }
    echo '</span>'; 
}

因此,您可以使用以下方法解析数组,而不是使用简单的“print_r”:

format_response(farray_diff(explode(' ',$str2)));

并且您获得(在示例后)这样的事情:

<span class="old"></span><span class="new">I response in your text: </span><span class="old">This is a simple text </span><span class="new">(no so simple) </span><span class="old">that can </span><span class="new">be replied,so can </span><span class="old">you do it? </span><span class="new">Yes,I can! </span>

显然,为了正确显示你之前需要定义css“old”和“new”类的结果,有一些不同,pex:不同的前景色:

<style>.old{color: #808080;}.new{color:#000000}</style>

对于HTML电子邮件,或者您可以修改format_response函数以显示no-html电子邮件.

注意:您可以看到我的功能是免费软件,并且符合GNU通用公共许可证.

希望它能帮到你.

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...