【发布时间】:2020-08-20 13:20:42
【问题描述】:
我正在处理来自所见即所得编辑器的 HTML 格式的新闻文章,我需要找到它的中间部分,但在视觉/HTML 上下文中,这意味着两个根元素之间的空白位置。如果您想将文章分成两页,比方说,在可能的情况下,每页的段落数相同。
所有根元素似乎都以段落的形式出现,这很容易计算,很简单
$p_count = substr_count($article_text, '<p');
返回开头段落标签的总数,然后我可以查找($p_count/2)-第一个段落出现的strpos。
但问题在于嵌入的推文,其中包含段落,有时出现在blockquote > p 下,有时显示为center > blockquote > p。
所以我转向 DOMDocument。这个小 sn-p 给了我中间的第 n 个元素(即使元素是 div 而不是段落,这很酷):
$dom = new DOMDocument();
$dom->loadHTML($article_text);
$body = $dom->getElementsByTagName('body');
$rootNodes = $body->item(0)->childNodes;
$empty_nodes = 0;
foreach($rootNodes as $node) {
if($node->nodeType === XML_TEXT_NODE && strlen(trim($node->nodeValue)) === 0) {
$empty_nodes++;
}
}
$total_elements = $rootNodes->length - $empty_nodes;
$middle_element = floor($total_elements / 2);
但是我现在如何在我的原始 HTML 源中找到这个中间元素的字符串偏移量,以便我可以指向文章文本字符串中的这个中间位置?特别是考虑到 DOMDocument 将我给它的 HTML 转换成一个完整的 HTML 页面(带有 doctype、head 等等),所以它的输出 HTML 比我原来的 HTML 文章源要大。
【问题讨论】:
-
找到正确的字符串偏移量并不容易,我认为你最好在 DOM 中你确定的位置插入一个新节点。 “所以它的输出 HTML 比我原来的 HTML 文章源要大” - DOMDocument 的
save方法允许您再次指定要“导出”的节点,所以如果您指定正文节点在那里,你不应该有太多多余的数据,并且可能可以使用字符串函数从结果中删除<body>和</body>。 -
@CBroe 可能是一个很好的解决方法,我会尝试使用它,感谢您的建议
标签: php domdocument