Как спарсить строки из html файла на php?

379
31 января 2017, 20:18

Всем доброй ночи Есть текстовый документ .txt в котором с новой строки написаны фразы, и есть html документ, где с новой строки идет код + фразы из списка. Строк в html порядка 1000, возможно ли, спарсить все строки из html, в которых есть совпадения с .txt. Фразы в html и txt используются по 1 разу, т.е не повторяются.

Пример строк .txt:

  • Фраза 1
  • Фраза 2
  • Фраза 3
  • Новая фраза

Пример строк в html

<tr><td></td><td></td><td>Фраза 3</td><td></td></tr>
<tr><td></td><td></td><td>Этой фразы нет</td><td></td></tr>
<tr><td></td><td></td><td>Фраза 1</td><td></td></tr>

Получается что в 3 ячейке встречается фраза, а в остальных - произвольные данные

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

Answer 1

Для выполнения данной задачи вам, очевидно, для начала потребуется получить данные из обоих файлов. Сделать это можно с помощью функции file(), которая возвращает массив строк из файла. С помощью флага FILE_IGNORE_NEW_LINES можно исключить символ конца строки \n из элементов массива.

Дальнейший алгоритм можно строить по разному, исходя из потребностей в эффективности. В любом случае у нас будет цикл по строкам html-файла, внутри которого необходимо определить, встречается ли такая строка в текстовом файле. В самом простом случае для этого нам потребуется вложенный цикл для проверки строк. Если необходимо повысить эффективность, то можно сортировать список строк и использовать бинарный поиск.

Разбить исходную html-строку и вытащить из нее содержимое последней ячейки можно, несколькими путями. Наиболее простыми будет использование функции explode(), либо с помощью регулярных выражений. Разделителем для explode() будет </td><td>. В результате чего в последнем 4-м элементе массива получим искомую строку, оканчивающуюся на </td></tr>. Эти символы, в свою очередь, можно либо просто убрать с помощью substr(), либо заменить через str_replace(), либо убрать, используя strip_tags().

Во вложенном цикле сравнения строк, если совпадение найдено, то исходную html-строку добавляем в массив результатов, а найденную исходную текстовую строку удаляем из массива строк, т.к. больше она нам, согласно условию, не встретится.

Исходя из вышенаписанного, код решения задачи имеет следующий вид:

$strings = file("strings.txt", FILE_IGNORE_NEW_LINES);
$html = file("data.txt", FILE_IGNORE_NEW_LINES);
$result = [];
foreach($html as $row){
    $value = array_pop(explode("</td><td>", $row, 4));
    $value = substr($value, 0, -10);     // удалить </td></tr>
    foreach($strings as $k => $str){
        if($str == $value){
            $result[] = $row;
            unset($strings[$k]);
            break;
        }
    }
}
print_r($result);
READ ALSO
Не работают media query в IE9

Не работают media query в IE9

Привет! Верстка mobile first, поэтому грузятся только мобильные стилиОтчего-то не работают media в 9ке, что сделано: 1

317
Некорректное отображение HTML письма на iOS

Некорректное отображение HTML письма на iOS

ЗдравствуйтеПодскажите, пожалуйста, в чем может быть косяк

330
Ограничение достпу к файлу для всех программ, кроме одной

Ограничение достпу к файлу для всех программ, кроме одной

Здравствуйте, пишу программу для возможности задания ограничения на открытие файла для всех программ, кроме определенной (по возможности...

510
Кэшированый делегат в C#

Кэшированый делегат в C#

Что значит фраза "делегат кэшируется" в этом контексте (и вообще, что такое "кэшированный делегат и для чего он):

393