Сравнение двух документов Word или Excel или Power Point 2007 с использованием PHP или Javascript программно - PullRequest
0 голосов
/ 13 октября 2018

Ниже приведены некоторые требования для моего нового проекта.

Администратор загрузит файл в формате Ms Word 2007 или Ms Excel 2007 или Ms Power Point 2007.

Допустим,этот администратор загрузил файл с именем demo1.docx file.

Теперь demo1.docx является основным файлом.

Теперь другие пользователи будут загружать свои собственные файлы, такие как demo2.docx, demo3.docx и т. Д.

Я хочу сравнить файлы demo2.docx и demo3.docx с мастер-файлом demo1.docx.

Файлы, загруженные другими пользователями, должны быть копией основного файла.Я имею в виду, что количество символов, текста, форматирования должно быть таким же, как у основного файла.

Если это файл Excel, то количество листов, нет.заполненных ячеек должны быть одинаковыми, и то же самое относится и к файлам Power Point.

Я хочу сделать это с помощью PHP или Javascript.

Так что вы можете сказать мне, если это возможно или нет?и если это возможно, предложите мне несколько способов выполнить эту задачу.

Заранее спасибо.

1 Ответ

0 голосов
/ 13 октября 2018

Чтобы сопоставить их байт за байт, наиболее эффективным способом является

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), что намного проще хранить в БД или визуализировать.Я упоминаю о БД, потому что вы можете разрезать операцию пополам, предварительно нормализуя и хешируя известный файл (исходный файл).Это уменьшит общую стоимость их сравнения.

ОБНОВЛЕНИЕ

Вот пример

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
        )

) 

Важно отметить, что индекс соответствия(-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

Песочница

Надеюсь, это поможет.

...