以编程方式使用 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))
如果这太精确,您可以去除空格。来自文本文件,而不是像 docx
或 xlsx
文件这样的二进制文件。
if(hash('sha1', str_replace(' ', '', file_get_contents( $pathToFile1))) == hash('sha1', str_replace(' ', '', file_get_contents( $pathToFile2))))
或类似的东西来标准化文本。对于二进制文件类型,您必须先为该类型的文件使用一些库才能将它们转换为文本。
换句话说,您必须想出一些方法来规范文件的文本内容,例如大写所有内容并删除空格或其他可接受的差异。
规范化是一种奇特的说法,消除了差异。一个简单的例子就是这个。
Some text
这和 Some text.
一样吗?或 Some Text
或 some 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
少量文本与大量文本没有什么不同。上面两段代码之间的区别是我标准化了一个而不是另一个。
更新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
希望对您有所帮助。
以下是我的新项目的一些要求。
管理员将上传 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))
如果这太精确,您可以去除空格。来自文本文件,而不是像 docx
或 xlsx
文件这样的二进制文件。
if(hash('sha1', str_replace(' ', '', file_get_contents( $pathToFile1))) == hash('sha1', str_replace(' ', '', file_get_contents( $pathToFile2))))
或类似的东西来标准化文本。对于二进制文件类型,您必须先为该类型的文件使用一些库才能将它们转换为文本。
换句话说,您必须想出一些方法来规范文件的文本内容,例如大写所有内容并删除空格或其他可接受的差异。
规范化是一种奇特的说法,消除了差异。一个简单的例子就是这个。
Some text
这和 Some text.
一样吗?或 Some Text
或 some 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
少量文本与大量文本没有什么不同。上面两段代码之间的区别是我标准化了一个而不是另一个。
更新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
希望对您有所帮助。