如何使用 PHPs DomDocument 获取元素和内容结构?
How to get both element and content structure using PHPs DomDocument?
假设我想根据页面的元素和内容结构实现自动字体请求优化,我如何使用 PHPs DomDocument 获取所需的信息?
这个问题可以用两个结构例子来概括说明:
示例 1
<p><em>All italic paragraph text</em></p>
示例 2
<p>Normal paragraph text <em>and some italic text</em></p>
两个示例中的元素结构相同,即段落元素带有 <em>
子元素。但是,内容结构不同:示例 1 中的所有文本都是斜体,但示例 2 中既有普通文本也有斜体文本。
我目前获取元素结构的方法是这样的:
$dom = new DOMDocument;
foreach ($dom->getElementsByTagName('p') as $elm) {
$elms[] = $dom->saveHTML($elm);
}
然后我将遍历元素并使用相同的方法查找嵌套元素,例如 <em>
和 <strong>
。
但是我需要一个好的内容结构方法。我想我可以用 <em>
和 </em>
拆分文本,看看结果列表中的第一个和最后一个元素是否有长度,但这让我想起了使用正则表达式进行自定义 HTML 搜索,这似乎是这里最不推荐的方法。
但是在这种情况下我有什么选择呢?
您可以使用 DOMXPath 来查找各个文本节点:
$html = "<p>Normal paragraph text <em>and some italic text</em></p>";
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$textNodes = $xpath->query("//text()");
$elms = [];
foreach ($textNodes as $elm) {
$elms[] = array(
"parent" => $elm->parentNode->tagName,
"path" => $elm->parentNode->getNodePath(),
"text" => $elm->textContent
);
}
$elms
将包含:
array (
array (
'parent' => 'p',
'path' => '/html/body/p',
'text' => 'Normal paragraph text ',
),
array (
'parent' => 'em',
'path' => '/html/body/p/em',
'text' => 'and some italic text',
),
)
假设我想根据页面的元素和内容结构实现自动字体请求优化,我如何使用 PHPs DomDocument 获取所需的信息?
这个问题可以用两个结构例子来概括说明:
示例 1
<p><em>All italic paragraph text</em></p>
示例 2
<p>Normal paragraph text <em>and some italic text</em></p>
两个示例中的元素结构相同,即段落元素带有 <em>
子元素。但是,内容结构不同:示例 1 中的所有文本都是斜体,但示例 2 中既有普通文本也有斜体文本。
我目前获取元素结构的方法是这样的:
$dom = new DOMDocument;
foreach ($dom->getElementsByTagName('p') as $elm) {
$elms[] = $dom->saveHTML($elm);
}
然后我将遍历元素并使用相同的方法查找嵌套元素,例如 <em>
和 <strong>
。
但是我需要一个好的内容结构方法。我想我可以用 <em>
和 </em>
拆分文本,看看结果列表中的第一个和最后一个元素是否有长度,但这让我想起了使用正则表达式进行自定义 HTML 搜索,这似乎是这里最不推荐的方法。
但是在这种情况下我有什么选择呢?
您可以使用 DOMXPath 来查找各个文本节点:
$html = "<p>Normal paragraph text <em>and some italic text</em></p>";
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$textNodes = $xpath->query("//text()");
$elms = [];
foreach ($textNodes as $elm) {
$elms[] = array(
"parent" => $elm->parentNode->tagName,
"path" => $elm->parentNode->getNodePath(),
"text" => $elm->textContent
);
}
$elms
将包含:
array (
array (
'parent' => 'p',
'path' => '/html/body/p',
'text' => 'Normal paragraph text ',
),
array (
'parent' => 'em',
'path' => '/html/body/p/em',
'text' => 'and some italic text',
),
)