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

Compare two word or excel or power point documents 2007 using PHP or Javascript programatically

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

管理员将上传 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个文件,那么张数,没有。填充的单元格数量必须相同,同样的事情适用于 powerpoint 文件。

我想使用 PHP 或 Javascript 来执行此操作。

所以你能告诉我这是否可能吗?如果可能的话,建议我一些方法来完成这个任务。

提前致谢。

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

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 视情况而定。但是 "normalizing them" 可能看起来像这样 sometext,没有标点符号、空格或大小写。由您决定如何规范化它们。

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

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

散列很好,因为它需要一个 {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

ok. do u know the softwares like Typing Tutor.. which takes typing test. There is one fixed paragraph and user will write that paragraph in text box with same formatting.

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

) 

值得一提的是,匹配项 (-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

希望对您有所帮助。