使用PHP或Javascript以编程方式比较两个word或excel或powerpoint文档2007

时间:2018-10-13 03:52:04

标签: php excel ms-word compare powerpoint

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

管理员将上传文件,其格式为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做到这一点。

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

谢谢。

1 个答案:

答案 0 :(得分: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打开它们,这将需要一些第三方库。

您的问题涉及面很广,所以我只能为您做一个广泛的概述。

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

更新

这里是一个示例

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

少量文本与大量文本没有什么不同。上面两段代码之间的差异是我对其中一个进行了归一化,而对另一不进行了归一化。

UPDATE1

  

好。您是否知道像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

我希望有帮助。