我正在建立一个票务系统,但我不想把其中一个消息
************************* REPLY ABOVE THIS LINE ***********************
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, array('o' => '', 'n' => $array2[$j]));
}
}
$i++; $j++;
}
return $out;
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以简单地使用它,如下例所示:
$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)));
Run Code Online (Sandbox Code Playgroud)
返回:
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!
)
Run Code Online (Sandbox Code Playgroud)
它就像一个简单的差异,但没有“+”和“-”,在轻松解析后都被替换为“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>';
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用以下方法解析数组,而不是使用简单的“print_r”:
format_response(farray_diff(explode(' ', $str1), explode(' ', $str2)));
Run Code Online (Sandbox Code Playgroud)
你会得到(按照这个例子)这样的东西:
<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>
Run Code Online (Sandbox Code Playgroud)
显然,为了正确显示结果,您之前需要定义有一些差异的 css“旧”和“新”类,pex:不同的前景色:
<style>.old{color: #808080;}.new{color:#000000}</style>
Run Code Online (Sandbox Code Playgroud)
对于 html 电子邮件,或者您可以修改 format_response 函数以显示非 html 电子邮件。
注意:如您所见,我的功能是免费软件,并且受 GNU 通用公共许可证约束。
希望对您有帮助。