【问题标题】:PHP Convert 2 strings into binary, compare the differences and save differencesPHP将2个字符串转换成二进制,比较差异并保存差异
【发布时间】:2014-07-19 09:11:00
【问题描述】:

是否有任何方法/函数可以比较 2 个二进制字符串之间的差异(例如,变量字符串中的 1 个和文件中的 1 个),并且仅将这些差异重新保存回变量字符串或文件中?

例如。

01010000 01001000 01010000 00100000 01100001 01110010 01100101 00100000 01100111 01101111 01101111 01100100 00100001

PHP 不错!

01010000 01001000 01010000 00100000 01101001 01110011 00100000 01100111 01101111 01101111 01100100 00100000 01101101 01100001 01101110 00100001

PHP 是个好人!

比较差异的命令会选择“are”/“is”和“man”

并且只有这些差异会被重新保存到变量字符串或文件中

0101001 01100110110101100101C201C1010101C10101C10110000

PHP [del]是[/del][ins]是[/ins] 好[ins] man[/ins]!

另一个例子:

01010000 01001000 01010000 00100000 01100001 01110010 01100101 00100000 01100111 01101111 01101111 01100100 00100001

PHP 不错!

01010000 01001000 01010000 00100000 01110100 01101000 01100101 00100000 01100111 01101111 01101111 01100100 00100001

PHP 好!

而将被保存的将是它们之间的区别,即“是/该” 所以它变成了

01100001010010011001C100001/10110010010000001C100001000000

PHP [del][/del][ins][/ins] 不错!

对不起,如果它看起来很乱。我不想使用代码框来防止部分看到二进制文件并更容易比较

【问题讨论】:

  • 我不同意你的观点。 Similar_text 只是计算相似度并从您的来源中引用“返回两个字符串中匹配字符的数量。” levenstein 仅计算更改的总数,但不会将其返回给您。 strcmp() 的工作方式类似于similar_text 和levenstein 的组合。我正在寻找的是可以返回和保存的差异,类似于 php 中的 array_diff,但对于字符串,可以保存这些差异。
  • strcmp() 可以使用,但它仍然没有回答如何将差异保存到变量字符串或文件中并消除差异的问题。
  • 方法@Loz Cherone ツ,无缘无故地对此投反对票,只是删除你的评论,让我看起来像是在自言自语
  • 我不会反对它。看到+1,我的评论也是错误的,想回答。

标签: php binary string-comparison


【解决方案1】:

如果我理解正确,您希望array_diff() 在两个字符串上具有行为,那么只需将explode() 它们放入一个数组中,之前不需要对它们进行base2(如果源是base2,则将其转换回来) .

但从您的预期输出来看,您不会仅从 array_diff() 获得您想要的。

您需要在array_diff() 中使用array_merge()array_intersect() 来返回不同之处。

这里是用户函数:

<?php
function str_diff($stringA='', $stringB='')
{
    $arrayA = explode(' ', $stringA);
    $arrayB = explode(' ', $stringB);

    //What I think you want
    return array_diff(
        array_merge($arrayA, $arrayB),
        array_intersect($arrayA, $arrayB)
    );

    //There's also this, but A has priority over B
    //return array_diff($arrayA, $arrayB);

    //And this returns just all unique, not compared
    //return array_unique(array_merge($arrayA, $arrayB));
}
?>

示例 A

<?php
$strA = "PHP are good!";
$strB = "PHP is good man!";

$diff = str_diff($strA, $strB);

/*
Array
(
    [1] => are
    [2] => good!
    [4] => is
    [5] => good
    [6] => man!
)
*/
echo '<pre>'.print_r($diff, true).'</pre>';
//are good! is good man!
echo implode(' ', $diff);
?>

示例 B

<?php 
$strA = "PHP are good!";
$strB = "PHP the good!";

$diff = str_diff($strA, $strB);

/*
Array
(
    [1] => are
    [4] => the
)
*/
echo '<pre>'.print_r($diff, true).'</pre>';
//are the
echo implode(' ', $diff);
?>

字符串的保存将是对file_put_contents()的微不足道的调用

希望对你有帮助。

【讨论】:

  • 感谢您的洞察力。首先,我想对造成的误解表示歉意。我希望你能原谅我。无论如何,将其转换为 base2 是为了提高准确性,因为您提供的方法考虑了使用空格分割的字符。但是如果你有像“abcdefghi”和“abcdetghi”这样的东西会发生什么?
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多