2010-08-03 1 views
0

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

//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 для этого?

ответ

4

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

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

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

1

У меня еще не возникли проблемы с синтаксическим анализом хорошо сформированного HTML с помощью DomDocument ... Есть некоторые проблемы, если HTML не правильно сформирован (Mis-совпадающие теги, без закрытия > и т. Д.), Но с хорошо Это довольно легко.

$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 specification ...

1

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

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

Смежные вопросы