arc / html
Ariadne 组件库:html 编写器和解析器组件
3.0
2020-02-23 13:52 UTC
Requires (Dev)
- phpunit/phpunit: 9.*
README
arc/html
此组件提供统一的html解析器和编写器。编写器允许在不使用模板的情况下在代码中生成可读性和正确的html。解析器是DOMDocument和SimpleXML的包装器。
解析器和编写器还可以在HTML片段上工作。解析器还确保输出与输入相同。当将节点转换为字符串时,\arc\html将返回包括标签在内的完整html字符串。如果您不希望这样,您始终可以访问'nodeValue'属性以获取原始SimpleXMLElement。
最后,解析器还增加了使用基本的CSS选择器在HTML中查找元素的能力。
use \arc\html as h; $htmlString = h::doctype() .h::html( h::head( h::title('Example site') ), h::body( ['class' => 'homepage'], h::h1('An example site') ) );
$html = \arc\html::parse($htmlString); $title = $html->head->title->nodeValue; // SimpleXMLElement 'Example site' $titleTag = $html->head->title; // <title>Example site</title>
CSS选择器
$title = current($html->find('title'));
find()方法始终返回一个数组,可能为空。通过使用current(),您可以得到找到的第一个元素,如果没有找到,则为null。
以下CSS选择器受到支持
tag1 tag2
这匹配tag2
,它是tag1
的子代。tag1 > tag2
这匹配tag2
,它是tag1
的直接子代。tag:first-child
这仅匹配作为第一个子代的tag
。tag1 + tag2
这仅匹配紧接在tag1
后面的tag2
。tag1 ~ tag2
这仅匹配有先前兄弟元素tag1
的tag2
。tag[attr]
这匹配具有属性attr
的tag
。tag[attr="foo"]
这匹配具有属性attr
且其值为foo
的tag
。tag#id
这匹配任何具有idid
的tag
。#id
这匹配任何具有idid
的元素。tag.class-name
匹配任何具有classclass-name
的tag
。.class-name
匹配任何具有classclass-name
的元素。
SimpleXML
解析的HTML的行为几乎与SimpleXMLElement相同,但有一些例外。因此,您可以像SimpleXMLElement允许的那样访问属性
$class = $html->html->body['class']; $class = $html->html->body->attributes('version');
您可以通过节点树进行遍历
$title = $html->html->head->title;
SimpleXMLElement中可用的任何方法或属性都包含在\arc\html解析的数据中。
DOMElement
除了SimpleXMLElement方法外,您还可以调用DOMElement中可用的任何方法和大多数属性。
$class = $html->html->body->getAttributes('class'); $title = current($html->getElementsByTagName('title'));
解析片段
arc\html解析器还接受部分HTML内容。它不需要单个根元素。
$htmlString = <<< EOF <li> <a href="anitem/">An item</a> </li> <li> <a href="anotheritem/">Another item</a> </li> EOF; $html = \arc\html::parse($htmlString); $links = $html->find('a');
并且当您将HTML转换回字符串时,它仍然是一个部分HTML片段。
如果您解析一个HTML标签,除了<html>
之外,您还必须引用此元素以访问它
$htmlString = <<< EOF <ul> <li> <a href="anitem/">An item</a> </li> <li> <a href="anotheritem/">Another item</a> </li> </ul> EOF; $html = \arc\html::parse($htmlString); $ul = $html->ul;
为什么使用这个而不是DOMDocument或SimpleXML?
arc\html::parse有以下不同之处
- 当转换为字符串时,它返回原始HTML,不包含您未添加的任何内容。
- 您可以使用它与部分HTML片段一起使用。
- 不需要记住在appendChild()或insertBefore()之前调用importNode()。
- 不需要在SimpleXML和DOMDocument之间切换,因为您只需要那个在其他API中仅有的方法。
- 当返回元素列表时,您始终得到一个简单的数组,而不是一个魔法NodeList。
此外,arc\html 还可以作为生成有效和缩进的 HTML 的简单方法,代码可读且自我验证。