2011-01-30 44 views
8

Tôi đang xây dựng một hệ thống vé, nhưng tôi không muốn đặt một trong những thông điệpPHP - Gmail giống như Email Nội dung Tách

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

Gmail có xu hướng để làm một ý tưởng khá tốt với họ " văn bản được trích dẫn ". Có ai biết bất kỳ kịch bản premade hoặc phương pháp để làm điều này một cách dễ dàng? Tôi đang cố gắng trả lời câu trả lời của họ về hệ thống của chúng tôi.

Cảm ơn, Kerry

+0

Tôi đoán họ có rất nhiều dữ liệu thử nghiệm và đã phát triển thuật toán "bí mật". – jantimon

+6

Đây có thể là một biến thể trong quá trình "khác biệt" - so sánh thông điệp mới với nội dung của (các) cũ. Tôi sẽ đề nghị nghiên cứu dọc theo dòng đó. –

Trả lời

2

tôi nghĩ rằng bạn cần một cái gì đó giống như chức năng mảng diff đầy đủ của tôi:

/** 
     Full Array Diff implemented in pure php, written from scratch. 
     Copyright (C) 2011 Andres Morales <[email protected]> 

     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: 
     [email protected] <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; 
    } 

vì vậy, bạn chỉ có thể sử dụng nó như trong ví dụ sau:

$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))); 

Returns:

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! 
     ) 

Nó giống như một khác biệt đơn giản, nhưng không có "+" và "-", cả hai đã được thay thế sau khi phân tích cú pháp dễ dàng bằng phím "o" (cũ) và "n" (cho mới).Và bạn có thể sử dụng chức năng sau đây để phân tích kết quả:

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>'; 
} 

Vì vậy, thay vì sử dụng một cách đơn giản "print_r" bạn có thể phân tích các mảng sử dụng:

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

và bạn có được (sau đây ví dụ) một cái gì đó như thế này:

<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> 

Rõ ràng, để hiển thị một cách chính xác kết quả bạn trước khi cần phải xác định các css "cũ" và lớp "mới" với một số diference, pex: khác nhau màu foreground:

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

cho email html hoặc bạn có thể sửa đổi hàm format_response để hiển thị email không có html.

LƯU Ý: Vì bạn có thể thấy các chức năng của tôi là phần mềm tự do và nằm trong Giấy phép Công cộng GNU.

Hy vọng nó sẽ giúp bạn.

+0

Chưa có cơ hội để thử điều này - nhưng sẽ sớm có –

+0

Ok! Sử dụng nó và xin vui lòng, cho tôi phản hồi –

2

Bạn luôn có thể sử dụng email HTML và đặt một số loại phân cách trong HTML comments:

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

và rơi trở lại một cách đơn giản

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

trong trường hợp người dùng không hỗ trợ email HTML. Bạn chỉ cần tìm kiếm sau này trên các email bạn đang phân tích cú pháp và nó sẽ hoạt động tốt trên cả hai trường hợp (văn bản thuần và html).

0

Nó có vẻ như Gmail được làm một số khớp regex công phu vào "văn bản trích dẫn" tiêu đề phổ biến, ví dụ:

----- Thư gốc -----
Từ: ...
Sent : ...
Tới: ...
Subject: ...

HOẶC

On < ngày >, John S mith <email> đã viết:
...

HOẶC

__ _ __ _ __ _ __ _ ____
Từ: ...
Đã gửi: ...
Tới: ...
Subject: ...

Và họ không thực sự nhận ra tất cả trong số họ cũng ....

Các vấn đề liên quan