PHP - Gmail-подобное разделение содержимого электронной почты - PullRequest
8 голосов
/ 31 января 2011

Я строю систему тикетов, но не хочу помещать одно из этих сообщений

************************* REPLY ABOVE THIS LINE ***********************

Gmail имеет тенденцию делать довольно хорошую идею со своим "цитируемым текстом". Кто-нибудь знает какой-либо готовый сценарий или метод для этого легко? Я пытаюсь отправить их ответы обратно в нашу систему.

Спасибо, Керри

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Я думаю, вам нужно что-то вроде моей полной функции сравнения массивов:

 /** 
        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, array('o' => '', '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!
        )

Это похоже на простой diff, но без "+" и "-", оба были заменены после легкого анализа массивом "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(' ', $str1), 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 с некоторой разницей, pex: diferent color foreground color:

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

для html-писем, или вы можете изменить функцию format_response, чтобы показывать не-html-письма.

ПРИМЕЧАНИЕ. Как вы видите, мои функции являются свободным программным обеспечением и находятся под GNU GeneralПубличная лицензия.

Надеюсь, она вам поможет.

2 голосов
/ 31 января 2011

Вы всегда можете использовать электронные письма в формате HTML и добавить какой-либо разделитель в комментарии HTML:

<!-- **********SEPARATOR********** -->

и вернуться к простому

**********SEPARATOR**********

, если пользователь этого не делаетподдержка HTML-писем.Вы просто ищете последнее в сообщениях, которые анализируете, и оно должно работать в обоих случаях (простой текст и html).

0 голосов
/ 01 февраля 2011

Похоже, что Gmail выполняет сложные регулярные выражения для популярных заголовков "цитируемый текст", т. Е.

----- Исходное сообщение -----
От: ...
Отправлено: ...
Кому: ...
Тема: ...

OR

В , Джон Смит писал:
...

OR

__ _ __ _ __ _ __ _ ____
От: ...
Отправлено: ...
To: ...
Тема: ...

И они на самом деле не все хорошо распознают ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...