Мне нужен инструмент, который позволяет мне быстро генерировать HTML и Xquery его - PullRequest
0 голосов
/ 04 августа 2010

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

//Create an anchor tag
$anchor = new Tag("a", array("name"=>"anchor");
//Create a paragraph
$paragraph = Tag::Craft("p", "Lorem ipsum dolor sit amet, consectetur.");
//Create a container for them and add them;
$div = new Tag("p", "id='container'");
$div->add($anchor);
$div->add($paragraph);
echo $div;

Создает:

<div id="container">
  <a name="anchor" />
  <p>Lorem ipsum dolor sit amet, consectetur.</p>
</div>

Это все хорошо, я могу быстро создавать теги, заполнять их контентом и другими тегами и выводить их аккуратно. Однако я не могу ничего сделать, взять существующий html и разобрать его. Или найти тег, используя что-то вроде xPath.

Насколько я могу судить, у меня есть 2 варианта:

  • Запишите функцию xPath и синтаксический анализ в мой инструмент Tag. Отнимает много времени, раздражает, и, вероятно, усилия лучше потратить в другом месте.
  • Использовать объекты DOM. Очень скудная документация и местами не полностью выпеченная. Тем более что PHP производственной среды отстает на несколько шагов. Также это будет использоваться для HTML, а не для XML, что может вызвать много ошибок и спама в журнале.

Есть мысли о том, куда мне идти отсюда? Или опыт использования DOM для достижения этой цели?

Ответы [ 3 ]

4 голосов
/ 04 августа 2010

Я бы сказал, кусай пулю, иди за встроенным DOM.Чтобы дать вам несколько советов о ваших проблемах:

  • «скудная документация»: хотя руководство по PHP, возможно, не настолько многословно (на мой взгляд, достаточно, но на самом деле меньше, чем некоторые старые функции), этоЗа очень немногими исключениями стандарт DOM: документация для любой реализации DOM должна касаться работы.
  • Не полностью выпечен => пытаться уточнить, что именно вы имеете в виду?
  • DOMНекоторое время назад был в PHP, если вы используете PHP 5.0 или 5.1, вы, вероятно, можете его использовать.
  • Уровень ошибок DOM настраивается с помощью свойства DOMDocument->strictErrorChecking и с libxml_use_internal_errors(), чтовы можете использовать, чтобы подавить ошибки / решить для себя, что с ними делать.
  • У вас уже есть некоторая реализация, а с DOMDocument::registerNodeClass() вы можете попытаться сохранить большую часть этой функциональности, расширив DOMElement с помощьюфункции и атрибуты, которые вы пропустили, возможно, даже автоматически импортировать автономные элементы DOME в последний использованный DOMDocument путем расширения конструктора.
  • Реализация вОн оптимизирован на C и, вероятно, будет быстрее и без ошибок (на данный момент, может быть, вы отличный программист :)), чем ваша собственная реализация.

В целом, это зависит отпотребовалось время, чтобы переписать его в DOMDocument (который вы можете облегчить, расширив внутренние классы) или развернуть свои собственные расширения / дополнения в своей библиотеке.Если ваши потребности невелики и быстро удовлетворяются за счет развертывания собственных, непременно напишите свои собственные.Если вы идете по пути написания своей собственной реализации XPath (что звучит забавно :)), обязательно добавьте спецификацию whole XPath 1.0 или 2.0: нет ничего более разочаровывающего для будущих разработчиков, чем неполная реализацияиз спецификации, когда они этого не ожидают.

1 голос
/ 04 августа 2010

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

Обычно это не проблема, но при написании скребка для экрана для сайта, который выводит HTML, который заставил бы Adobe Pagemill позорить, это становится немного утомительным.

1 голос
/ 04 августа 2010

Я еще не сталкивался с какими-либо проблемами при разборе правильно сформированного HTML с помощью DomDocument ... Существуют некоторые проблемы, если HTML не правильно сформирован (несоответствующие теги, нет закрывающих > и т. Д.), Но с хорошо сложен, это довольно легко.

$dom = new DomDocument();
$dom->loadHtml($html);

$xpath = new DomXpath($dom);
$elements = $xpath->query('//div[@id="container"]//p');
foreach ($elements as $element) {
    echo $element->textContent;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...