【问题标题】:Compare two word or excel or power point documents 2007 using PHP or Javascript programatically以编程方式使用 PHP 或 Javascript 比较两个 word 或 excel 或 powerpoint 文档 2007
【发布时间】:2018-10-13 03:52:03
【问题描述】:

以下是我的新项目的一些要求。

管理员将上传格式为 Ms Word 2007 或 Ms Excel 2007 或 Ms Power Point 2007 的文件。

假设管理员上传了一个名为 demo1.docx 的文件。

现在 demo1.docx 是一个主文件。

现在其他用户将上传自己的文件,如 demo2.docx、demo3.docx 等。

我想将 demo2.docx 和 demo3.docx 文件与主文件 demo1.docx 进行比较。

其他用户上传的文件必须是主文件的副本。我的意思是字符数、文本、格式必须与主文件相同。

如果是excel文件,那么页数,没有。填充的单元格必须相同,并且相同的内容适用于 power point 文件。

我想使用 PHP 或 Javascript 来实现。

那么你能告诉我这是否可能吗?如果可能的话,然后建议我一些方法来完成这项任务。

提前致谢。

【问题讨论】:

  • 是的,如果它们是精确的副本,请使用hash_file function php.net/manual/en/function.hash-file.php
  • 如何使用此功能比较两个文件。请给我一个例子
  • if(hash_file('sha1', $pathToFile1) == hash_file('sha1', $pathToFile2)) 它们必须是相同的,字节对字节。这对你来说可能是相同的。您也可以使用md5,但我发现sha1 会快一点。
  • 这是我的代码:
  • $file1 = "files/admin/first.docx"; $file2 = "文件/用户/first.docx"; if(hash_file('sha1', $file1) == hash_file('sha1', $file2)) { echo "match"; } else { echo "不匹配"; }

标签: php excel ms-word compare powerpoint


【解决方案1】:

要逐字节匹配它们,最有效的方法是

if(hash_file('sha1', $pathToFile1) == hash_file('sha1', $pathToFile2))

如果这太精确了,你可以去掉空格。来自文本文件,而不是像 docxxlsx 文件这样的二进制文件。

if(hash('sha1', str_replace(' ', '', file_get_contents( $pathToFile1))) == hash('sha1', str_replace(' ', '', file_get_contents( $pathToFile2))))

或类似的东西来规范化文本。对于二进制文件类型,您必须使用该类型文件的某些库首先将它们转换为文本。

换句话说,您必须想出一些方法来规范文件的文本内容,例如大写所有内容并删除空格或其他可接受的差异。

规范化是一种奇特的说法,可以消除差异。一个简单的例子就是这样。

Some text

现在和Some text.一样吗?或Some Textsome Text,这取决于。但是“规范化它们”可能看起来像这样sometext,没有标点符号、空格或大小写。由您决定如何规范化它们。

由于提到了二进制格式,我无法帮助您,因为您需要找到一种在 PHP 中打开它们的方法,这需要一些 3rd 方库。

你的问题很笼统,所以我只能给你一个大致的概述。

散列很好,因为它需要一个 {x} 大小的文件并使其长度为 40 个字符(在 sha1 的情况下),这更容易存储在数据库中或可视化。我提到数据库是因为您可以通过对已知文件(源文件)进行预规范化和散列处理来将操作减半。这将降低比较它们的总体成本。

更新

这是一个例子

echo hash('sha1', 'The same text') == hash('sha1', 'the same text') ? 'true' : 'false';

输出将是false 但是如果你这样做:

echo hash('sha1', strtolower('The same text')) == hash('sha1', strtolower('the same text')) ? 'true' : 'false';

输出将是true

Sandbox

少量文本与大量文本没有什么不同。上面两段代码的区别是我规范了一个而不是另一个。

更新1

好的。你知道像 Typing Tutor 这样的软件吗?它需要打字测试。有一个固定的段落,用户将在文本框中以相同的格式写入该段落。

$old = 'The same text';
$arr_old = explode(' ', $old);
$new = 'the same text';

$pattern = '/\b('.implode(')\b|\b(', array_map('preg_quote', $arr_old)).')\b/';

preg_match_all($pattern, $new, $matches );

print_r($matches);

输出

  Array
(
    [0] => Array
        (
            [0] => same
            [1] => text
        )

    [1] => Array
        (
            [0] => 
            [1] => 
        )

    [2] => Array
        (
            [0] => same
            [1] => 
        )

    [3] => Array
        (
            [0] => 
            [1] => text
        )

) 

重要的是要提到 match(-1) 的索引,将匹配单词的索引。例如在上面没有匹配 $matches[1] 没有匹配。这对应于The,它是$arr_old = explode(' ', $old);[0=>'The', 1=>'same', 2=>'text'] 中的第一项但因为匹配是基于1 而数组是基于0,所以你必须减去1。

PS 检查这些我会做类似的事情

$len = count($matches);
for($i=1;$i<$len;$i++){
    if(!empty(array_filter($matches[$i]))) echo "match ".$arr_old[$i-1]."\n";
}

输出:

match same
match text

Sandbox

希望对你有帮助。

【讨论】:

  • 我不能使用 hash_file 函数,因为我想逐个字符地比较两个文件。因为基于该比较,我将生成用户的结果。那么使用哈希编码文件我将如何找到差异??
  • 我不知道这意味着什么 because based on that comparision i will generate result of users。如果您正确规范化数据,您可以将它们与哈希进行比较。你如何做到这一点取决于你认为是相同的。他们必须匹配多少。我没有办法知道这一点。我只能告诉你你可以尝试什么,由你来决定你必须做什么才能使两个不同但相似的事情变得相同。
  • 好的。你知道像 Typing Tutor 这样的软件吗?它需要打字测试。有一个固定的段落,用户将在文本框中以相同的格式写入该段落。测试完成后,软件会检查准确性和速度。我的概念与此大致相同,但在这里我必须比较文件并根据该文件比较生成结果
  • 那你需要把单词分开,比较一下。为此,我会使用 preg_match_all。
  • preg_match_all 会比较两个文件的格式??
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2018-12-16
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多