PHP – найти разницу в двух строках и получить путь к разнице

  • Автор темы Qwe4
  • Обновлено
  • 12, May 2024
  • #1
У меня есть 2 html-файла, которые используют один и тот же шаблон, только некоторые поля различаются, и мне нужно получить полный путь к этим различиям с помощью PHP. 1-й) 12 400Acura

2-й)

15 400Bmw

Итак, как вы можете видеть из примера, это тот же шаблон, но цена другая, и поэтому PHP-скрипт должен показывать xpath (эти результаты):

//div[@class='price']

//div[@class='make']

Скрипту необходимо найти разницу в двух файлах и получить xpath к этой разнице, очевидно, что шаблон неизвестен и каждый раз может быть другим.

Любая помощь приветствуется!!!

Qwe4


Рег
24 May, 2008

Тем
73

Постов
241

Баллов
636
  • 19, May 2024
  • #2
Эти html-файлы не генерируются с помощью PHP, они являются статическими файлами. На любом языке, включая PHP, вы можете получить доступ к любому объекту dom, используя xpath. загрузка htmk в $dom, затем создание DomXpath, после чего вы сможете получить доступ к любому узлу с помощью запросов XPath. Итак, PHP-скрипт должен найти динамическую часть между этими двумя html-файлами (в приведенном выше примере динамические части — это цена и марка транспортного средства), а затем мне нужно получить xpath к этому динамическому контенту.
 

Shtorkin


Рег
01 Jan, 2011

Тем
80

Постов
215

Баллов
645
  • 04, Jun 2024
  • #3
Вам просто нужен постоянный для сравнения каждого файла. То, что я написал, предполагает, что константа будет иметь то же самое HTML как переменная. Он ищет текст внутри каждого элемента это разное. Если это два совершенно разных файла, единственный способ сделать это — сравнить их по словам. В этом случае разница в любом случае будет практически бессмысленной. Не имеет значения, изменится ли шаблон. Вам просто нужно обновить постоянный Итак HTML (не обязательно текст) для постоянный & переменная одинаковы.
 

Itl_ua


Рег
01 Jan, 2011

Тем
78

Постов
200

Баллов
650
  • 08, Jun 2024
  • #4
О, ок, статические файлы и php xml.

Сначала вам нужно будет найти различия и получить массив каждой отличающейся строки.

Затем вы можете запросить их в xml.

Чтобы получить разные фразы, вам нужно извлечь весь текст из html в массив.

Единственный другой способ, который я вижу, — это сравнивать отдельные слова, что означает, что вы теряете фразы.

Итак, я написал код для извлечения «фраз» из HTML.

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

Я дважды читал, что это невозможно.

Если ты сможешь это сделать пожалуйста дайте мне знать, как вы это сделали.
 
<?php
$strConstant = file_get_contents("Test1.htm");
$strVariable = file_get_contents("Test2.htm");

$arXPaths = getXPaths($strVariable, getDiffArray($strConstant, $strVariable));
foreach($arXPaths as $value) {
 echo $value . "<br/>";
}
function getXPaths($strVariable, $arDiff) {
 $arXPaths = array();
 $doc = new DOMDocument();
 $doc->loadXML($strVariable);

 if(empty($arDiff) || !is_array($arDiff)) return false;
 foreach($arDiff as $strDiff) {
 $query = "http://*[text()[contains(.,'" . $strDiff . "')]]"; 
 $xpathvar = new Domxpath($doc);
 $queryResult = $xpathvar->query($query);
 foreach($queryResult as $node) {
 $arXPaths[] = $node->getNodePath(); //this isn't correct
 } 
 }
 return $arXPaths;
}

function getDiffArray($strConstant, $strVariable){
 $arDiff = array();
 $arConstant = getElemTextArray($strConstant);
 $arVariable = getElemTextArray($strVariable); 
 $diff = diff($arConstant, $arVariable);
 if(is_array($diff)) {
 foreach($diff as $k){
 if(is_array($k))
 {
 if(!empty($k['i'])) {
 foreach($k['i'] as $key => $value) { 
 $arDiff[] = $value; 
 }
 } 
 }
 }
 }
 return $arDiff;
}
function diff($old, $new){
 /*
 (C) Paul Butler 2007 <[URL='https://lumtu.com/yti/ZgccgZy9odHRwOi8vcGF1bGJ1dGxlci5vicl']http://www.paulbutler.org/[/URL]>
 May be used and distributed under the zlib/libpng license.
 */
 $matrix = array();
 $maxlen = 0;
 foreach($old as $oindex => $ovalue){
 $nkeys = array_keys($new, $ovalue);
 foreach($nkeys as $nindex){
 $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ?
 $matrix[$oindex - 1][$nindex - 1] + 1 : 1;
 if($matrix[$oindex][$nindex] > $maxlen){
 $maxlen = $matrix[$oindex][$nindex];
 $omax = $oindex + 1 - $maxlen;
 $nmax = $nindex + 1 - $maxlen;
 }
 } 
 }
 if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new));
 return array_merge(
 diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)),
 array_slice($new, $nmax, $maxlen),
 diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen)));
}

function getElemTextArray($html) {
 $arTexts = array(); 
 $nLastIdx = 0;
 $bBreak = false;

 $reg = "/(?<=>)\s*(?=<)|(?<=>)\n*([^<]+)/";
 if (preg_match_all($reg, $html, $arMatches)) {
 foreach($arMatches as $key => $value) {
 foreach($value as $key1 => $value1) {
 if(empty(trim($value1))) continue;
 if($key1 < $nLastIdx) {
 $bBreak = true;
 break;
 }
 $nLastIdx = $key1;
 $arTexts[] = $value1;
 }
 if($bBreak) break;
 }
 }
 return $arTexts;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[URL='https://lumtu.com/yti/dk55kdGRodHRwOi8vdzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbCh52']http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/URL]">
<html xmlns="[URL='https://lumtu.com/yti/b0hh0bWxodHRwOi8vdzMub3JnLzE5OTkveGvkT']http://www.w3.org/1999/xhtml[/URL]">
<head>
<meta http-equiv="Content-Type" content="текст/html; кодировка = utf-8" />
<title>Untitled Document</title>

</head>

<body>

</body>
</html>

Код (разметка):
 

Pwae


Рег
13 Apr, 2012

Тем
73

Постов
189

Баллов
574
  • 08, Jun 2024
  • #5
Я не совсем уверен, что вы пытаетесь сделать. Что вы подразумеваете под xpath? Это XML-термин. HTML генерируется из php? PHP не может напрямую читать HTML-код на странице. Он выполняется до отрисовки страницы и обычно используется для записи HTML. Это легко сделать в Javascript, потому что Javascript может получить доступ к html (объекту dom). Можете ли вы рассказать нам немного больше о том, что вы пытаетесь сделать?
 

Hichhock


Рег
01 Jan, 2011

Тем
76

Постов
182

Баллов
572
  • 13, Jun 2024
  • #6
Вы не знакомы с функциями (и слишком ленивы, чтобы искать документацию прямо сейчас), но если содержимое считывается в переменную-контейнер (в данном случае $dom) в виде массива (или вы можете заставить его это делать), вы можно было бы просто прочитать каждый файл в отдельные массивы и сделать что-то вроде:

 
function arrayDiff($A, $B) {
 $intersect = array_intersect($A, $B);
 return array_merge(array_diff($A, $intersect), array_diff($B, $intersect));
}


Код (разметка): это даст вам массив различий (несовпадающих элементов), который затем можно проанализировать для получения Xpath.

Возможно, это слишком сложно для того, что вам нужно, но это по крайней мере один из способов сделать это.
 

Andrey4


Рег
21 May, 2012

Тем
90

Постов
188

Баллов
648
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно