Как вы анализируете и обрабатываете HTML / XML в PHP?

Вы должны вычислить адрес для использования с atos, вы не можете просто использовать его в стеке.

symbol address = slide + stack address - load address
  1. Значение slide - это значение vmaddr в LC_SEGMENT cmd (В основном это 0x1000). Для этого запустите следующее:
    otool -arch ARCHITECTURE -l "APP_BUNDLE/APP_EXECUTABLE" | grep -B 3 -A 8 -m 2 "__TEXT"
    
    Замените ARCHITECTURE на фактическую архитектуру, отображаемую в отчете о сбое, например. armv7. Замените APP_BUNDLE/APP_EXECUTABLE на путь к фактическому исполняемому файлу.
  2. stack address - это шестнадцатеричное значение из отчета о сбое.
  3. . load address может быть первым адресом, отображающим в секции Binary Images в самой передней части строки, содержащей ваш исполняемый файл. (Обычно первая запись).

Так как в прошлом значение slide было равно значению load address, это всегда срабатывало. Но поскольку Apple представила рандомизацию расположения пространства адреса , начиная с iOS 4.3 (в разных вариантах), адрес загрузки приложений рандомизирован по соображениям безопасности.

2051
задан 26 revs, 17 users 27% 15 April 2019 в 12:30
поделиться

7 ответов

Родные расширения XML

Я предпочитаю использовать одно из родных расширений XML, поскольку они поставляются в комплекте с PHP, обычно быстрее, чем все сторонние библиотеки, и дают мне весь необходимый мне контроль над разметкой.

DOM

Расширение DOM позволяет вам работать с XML-документами через DOM API с PHP 5. Это реализация объектной модели документов W3C Core Level 3, независимый от платформы и языка интерфейс, который позволяет программам и сценарии для динамического доступа и обновления содержимого, структуры и стиля документов.

DOM способен анализировать и изменять реальный (сломанный) HTML, а также выполнять запросы XPath. Он основан на libxml.

Чтобы продуктивно работать с DOM, требуется некоторое время, но оно того стоит, IMO. Поскольку DOM — это интерфейс, не зависящий от языка, вы найдете реализации на многих языках, поэтому, если вам нужно изменить свой язык программирования, скорее всего, вы уже будете знать, как использовать DOM API этого языка.

Основной пример использования можно найти в Захват атрибута href элемента A, а общий концептуальный обзор можно найти в DOMDocument в php

Как использовать расширение DOM имеет широко освещался в StackOverflow, поэтому, если вы решите его использовать, вы можете быть уверены, что большинство проблем, с которыми вы столкнетесь, можно решить с помощью поиска/просмотра Stack Overflow.

XMLReader

Расширение XMLReader представляет собой синтаксический анализатор XML. Читатель действует как курсор, продвигающийся вперед в потоке документов и останавливающийся на каждом узле на пути.

XMLReader, как и DOM, основан на libxml. Я не знаю, как активировать модуль парсера HTML, поэтому есть вероятность, что использование XMLReader для синтаксического анализа поврежденного HTML может быть менее надежным, чем использование DOM, где вы можете явно указать ему использовать модуль парсера HTML libxml.

Базовый пример использования можно найти по адресу получение всех значений из тегов h1 с помощью php

XML Parser

Это расширение позволяет создавать анализаторы XML, а затем определять обработчики для различных XML-событий. Каждый анализатор XML также имеет несколько параметров, которые вы можете настроить.

Библиотека синтаксического анализатора XML также основана на libxml и реализует синтаксический анализатор XML в стиле SAX.Это может быть лучшим выбором для управления памятью, чем DOM или SimpleXML, но с ним будет сложнее работать, чем с парсером извлечения, реализованным XMLReader.

SimpleXml

Расширение SimpleXML предоставляет очень простой и удобный набор инструментов для преобразования XML в объект, который можно обрабатывать с помощью обычных селекторов свойств и итераторов массивов.

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

Базовый пример использования можно найти по адресу Простая программа для CRUD узлов и значений узлов XML-файла, а множество дополнительных примеров можно найти в Руководстве по PHP.


Сторонние библиотеки (на основе libxml)

Если вы предпочитаете использовать стороннюю библиотеку, я бы посоветовал использовать библиотеку, которая на самом деле использует DOM/libxml. вместо разбора строки.

FluentDomRepo

FluentDOM предоставляет плавный XML-интерфейс, подобный jQuery, для DOMDocument в PHP. Селекторы написаны на XPath или CSS (с использованием конвертера CSS в XPath). Текущие версии расширяют DOM, реализуя стандартные интерфейсы, и добавляют функции из DOM Living Standard. FluentDOM может загружать такие форматы, как JSON, CSV, JsonML, RabbitFish и другие. Можно установить через Composer.

HtmlPageDom

Wa72\HtmlPageDom` — это PHP-библиотека для простой работы с HTML. документы с использованием Требуется DomCrawler от Symfony2 компоненты для прохождения Дерево DOM и расширяет его, добавляя методы для управления DOM. дерево HTML-документов.

phpQuery (не обновлялся в течение многих лет)

phpQuery — это серверный API объектной модели документа (DOM) с поддержкой селектора CSS3 на стороне сервера, основанный на библиотеке jQuery JavaScript, написанной на PHP5, и предоставляет дополнительный интерфейс командной строки ( КЛИ).

Также см.: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom предоставляет инструменты для работы с документами и структурами DOM. В настоящее время мы предлагаем Zend_Dom_Query, который предоставляет унифицированный интерфейс для запросов к документам DOM с использованием селекторов XPath и CSS.

QueryPath

QueryPath — это библиотека PHP для работы с XML и HTML. Он предназначен для работы не только с локальными файлами, но и с веб-сервисами и ресурсами баз данных. Он реализует большую часть интерфейса jQuery (включая селекторы в стиле CSS), но сильно настроен для использования на стороне сервера. Можно установить через Composer.

fDOMDocument

fDOMDocument расширяет стандартный DOM, чтобы использовать исключения во всех случаях ошибок вместо предупреждений или уведомлений PHP. Они также добавляют различные пользовательские методы и ярлыки для удобства и упрощения использования DOM.

sabre/xml

sabre/xml — это библиотека, обертывающая и расширяющая классы XMLReader и XMLWriter для создания простой системы отображения «xml в объект/массив» и шаблона проектирования. Запись и чтение XML выполняются за один проход и поэтому могут быть быстрыми и требовать мало памяти для больших XML-файлов.

FluidXML

FluidXML — это библиотека PHP для работы с XML с кратким и плавным API. Он использует XPath и шаблон свободного программирования, чтобы быть интересным и эффективным.


Сторонние разработки (не основанные на libxml)

Преимущество сборки на основе DOM/libxml заключается в том, что вы сразу получаете хорошую производительность, поскольку вы основаны на собственном расширении. Однако не все сторонние библиотеки идут по этому пути.Некоторые из них перечислены ниже

PHP Simple HTML DOM Parser

  • Парсер HTML DOM, написанный на PHP5+, позволяет очень легко манипулировать HTML!
  • Требуется PHP 5+.
  • Поддерживает недопустимый HTML.
  • Находите теги на HTML-странице с помощью селекторов, как в jQuery.
  • Извлечение содержимого из HTML в одну строку.

Я вообще не рекомендую этот парсер. Кодовая база ужасна, а сам синтаксический анализатор довольно медленный и потребляет много памяти. Не все селекторы jQuery (например, дочерние селекторы) возможны. Любая из библиотек на основе libxml должна легко превзойти это.

PHP Html Parser

PHPHtmlParser — это простой и гибкий HTML-парсер, который позволяет выбирать теги с помощью любого селектора CSS, например jQuery. Цель состоит в том, чтобы помочь в разработке инструментов, которые требуют быстрого и простого способа удалить html, независимо от того, является ли он действительным или нет! Этот проект первоначально поддерживался sunra/php-simple-html-dom-parser, но поддержка, кажется, прекратилась, поэтому этот проект является моей адаптацией его предыдущей работы.

Опять же, я бы не рекомендовал этот парсер. Это довольно медленно с высокой загрузкой процессора. Также нет функции очистки памяти от созданных DOM-объектов. Эти проблемы особенно масштабируются при использовании вложенных циклов. Сама документация неточна и написана с ошибками, с 14 апреля 16 ответов на исправления нет.

Ganon

  • Универсальный токенизатор и парсер HTML/XML/RSS DOM.
    • Возможность манипулировать элементами и их атрибутами
    • Поддерживает недопустимый HTML и UTF8
  • Может выполнять расширенные CSS3-подобные запросы к элементам (например, jQuery — поддерживаются пространства имен)
  • Улучшитель HTML (например, HTML Tidy)
    • Минимизировать CSS и Javascript
    • Сортировка атрибутов, изменение регистра символов, правильный отступ и т. д.
  • Расширяемый
    • Анализ документов с использованием обратных вызовов на основе текущего символа/токена
    • Операции разделены на более мелкие функции для упрощения переопределения
  • Быстро и просто

Никогда не использовал. Не могу сказать, хорошо ли это.


HTML 5

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

html5lib

Реализация синтаксического анализатора HTML на Python и PHP на основе спецификации WHATWG HTML5 для максимальной совместимости с основными настольными веб-браузерами.

После окончательной доработки HTML5 мы можем увидеть больше специализированных синтаксических анализаторов. Существует также сообщение в блоге W3 под названием How-To for html 5 parsing, которое стоит проверить.


Веб-службы

Если вам не хочется программировать PHP, вы также можете использовать веб-службы. В общем, я нашел очень мало полезного для них, но это только я и мои варианты использования.

ScraperWiki.

Внешний интерфейс ScraperWiki позволяет извлекать данные в нужной вам форме для использования в Интернете или в ваших собственных приложениях. Вы также можете извлечь информацию о состоянии любого парсера.


Регулярные выражения

Последние и наименее рекомендуемые, вы можете извлекать данные из HTML с помощью регулярных выражений. В целом использование регулярных выражений в HTML не рекомендуется.

Большинство фрагментов, которые вы найдете в Интернете для соответствия разметке, ненадежны. В большинстве случаев они работают только с очень конкретной частью HTML. Мелкие изменения разметки, такие как добавление пробелов где-либо или добавление или изменение атрибутов в теге, могут привести к сбою RegEx, если он написан неправильно.Вы должны знать, что делаете, прежде чем использовать RegEx в HTML.

Синтаксические анализаторы HTML уже знают синтаксические правила HTML. Регулярные выражения нужно учить для каждого нового регулярного выражения, которое вы пишете. RegEx хорош в некоторых случаях, но это действительно зависит от вашего варианта использования.

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

Также см. Синтаксический анализ HTML по пути Ктулху


Книги

Если вы хотите потратить немного денег, посмотрите

Я не связан с Архитектор PHP или авторы.

1858
ответ дан 22 November 2019 в 19:59
поделиться

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

12
ответ дан troelskn 15 April 2019 в 12:30
поделиться

Просто используйте DOMDocument-> loadHTML () и быть сделанными с ним. алгоритм парсинга HTML libxml довольно хорош и быстр, и вопреки широко распространенному мнению, не дросселирует на уродливом HTML.

233
ответ дан Edward Z. Yang 15 April 2019 в 12:30
поделиться

Простой HTML DOM является большим синтаксическим анализатором с открытым исходным кодом:

simplehtmldom.sourceforge

Это рассматривает элементы DOM объектно-ориентированным способом, и новое повторение имеет много покрытия для несовместимого кода. Существуют также некоторые большие функции как, Вы видели бы в JavaScript, таком как функция "находки", которая возвратит все экземпляры элементов того имени тега.

я использовал это во многих инструментах, тестируя его на многих различных типах веб-страниц, и я думаю, что это работает отлично.

88
ответ дан Peter Mortensen 15 April 2019 в 12:30
поделиться

Вы могли попытаться использовать что-то как HTML, Опрятный к очистке любой "поврежденный" HTML, и преобразовать HTML в XHTML, который можно тогда проанализировать с синтаксическим анализатором XML.

15
ответ дан CesarB 15 April 2019 в 12:30
поделиться

Попробуйте Simple HTML DOM Parser

  • Синтаксический анализатор HTML DOM, написанный на PHP 5+, который позволяет очень легко манипулировать HTML!
  • Требуется PHP 5+.
  • Поддерживает недопустимый HTML.
  • Находите теги на HTML-странице с помощью селекторов, как в jQuery.
  • Извлечение содержимого из HTML в одну строку.
  • Скачать


Примеры:

Как получить HTML-элементы:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


Как изменить HTML-элементы:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


Извлечь содержимое из HTML:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


Скрапинг Slashdot:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);
319
ответ дан 22 November 2019 в 19:59
поделиться

Кстати, это обычно называют скребком экрана. Библиотека, которую я использовал для этого, это Simple HTML Dom Parser.

52
ответ дан 22 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: