以下是我的新项目的一些要求。
管理员将上传文件,其格式为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做到这一点。
那么你能告诉我是否可行吗?然后如果可以的话,建议我一些方法来完成这项任务。
谢谢。
答案 0 :(得分:1)
要使它们逐字节匹配,最有效的方法是
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
视情况而定。但是“标准化它们”可能看起来像这样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
少量文本与大量文本没有什么不同。上面两段代码之间的差异是我对其中一个进行了归一化,而对另一不进行了归一化。
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
我希望有帮助。