目前我有一个很好的类,可以生成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这样的东西找到一个Tag。
据我所知,我有两个选择:
关于我应该从哪里开始的任何想法?或者使用DOM来实现这一目标?
答案 0 :(得分:4)
我会说咬紧牙关,去内置DOM。为您提供一些关于您的问题的建议:
DOMDocument->strictErrorChecking
属性,而libxml_use_internal_errors()
可用于缓解错误/自行决定如何处理它们。DOMDocument::registerNodeClass()
您可以通过使用函数&amp;扩展DOMElement
来尝试保留大部分功能。您错过的属性,甚至可能通过扩展构造函数在上次使用的DOMDocument中自动导入独立的DOMElements。总而言之,它取决于将其重写为DOMDocument所需的时间(您可以通过扩展内部类来简化)或将您自己的扩展/添加内容扩展到库中。如果您的需求很小并且很快就会推出自己的需求,请务必编写自己的。如果你正在编写自己的XPath实现的路线(这听起来很有趣:)),请务必添加整个 XPath 1.0或2.0规范:没有什么比未来的开发人员更令人沮丧当他们不期望它时,实施规范。
答案 1 :(得分:1)
我还没有遇到过使用DomDocument解析结构良好的HTML的任何问题......如果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 specification来找到你需要的东西......
答案 2 :(得分:1)
PHP的DOM唯一的问题是它在加载格式错误的HTML方面非常挑剔。它会扼杀并消除垃圾,加载大多数浏览器都会愉快地飞过的东西,需要一些预加载的黑客/清理才能让它可以接受。
通常不是问题,但是当为输出HTML的网站编写屏幕抓取工具时会让Adobe Pagemill感到羞耻,这会让人感到有点乏味。