Чтобы сопоставить их байт за байт, наиболее эффективным способом является
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
Песочница
Надеюсь, это поможет.