arc/html

Ariadne 组件库:html 编写器和解析器组件

3.0 2020-02-23 13:52 UTC

This package is auto-updated.

Last update: 2024-09-10 23:11:18 UTC


README

Scrutinizer Code Quality Code Coverage Latest Stable Version Total Downloads Latest Unstable Version License

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
    这仅匹配有先前兄弟元素tag1tag2
  • tag[attr]
    这匹配具有属性attrtag
  • tag[attr="foo"]
    这匹配具有属性attr且其值为footag
  • tag#id
    这匹配任何具有id idtag
  • #id
    这匹配任何具有id id的元素。
  • tag.class-name
    匹配任何具有class class-nametag
  • .class-name
    匹配任何具有class class-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 的简单方法,代码可读且自我验证。