首页 > 解决方案 > PHP 将 div 转换为自定义标签

问题描述

我正在尝试使用 PHP 将一些 html 标签转换为自定义标签。我一直在尝试使用 DOMDocument,但发现它非常麻烦。在 PHP / DOMDocument 中是否有一种简单的方法可以做到这一点?

输入:

<div class="element_wrapper">
    <div class="element_header">My header</div>
    <div class="element">
        <div class="name">Element Name</div>
    </div>
</div>

期望的输出:

<element_wrapper>
    <element_header>My Header</element_header>
    <element>
        <name>Element Name</name>
    </element>
</element_wrapper>

我的第一种方法(不完整,根据 AndrewL64 的要求添加):

<?php

$templates = Repository::fetchTemplates();

$classes = [
    'element_wrapper',
    'element',
    'name',
    'element_header',
];

foreach ($templates as $template) {
    $html = '<div>' . $template['html_body'] . '</div>';
    $dom = new DOMDocument();
    $dom->loadHTML($html);
    $finder = new DOMXPath($dom);
    foreach ($classes as $class) {
        $div_nodes = $finder->query("//div[@class='$class']");
        /** @var DOMNode $div_node */
        foreach ($div_nodes as $div_node) {

            /** @var DOMElement $custom_tag */
            $custom_tag = $dom->createElement($class, $div_node->nodeValue);
            if ($div_node->hasAttributes()) {
                foreach ($div_node->attributes as $attribute) {
                    if ($attribute->nodeValue === $class) {
                        continue;
                    }
                    $custom_tag->setAttributeNode($attribute);
                }
            }
            $div_node->parentNode->replaceChild($custom_tag, $div_node);
        }
    }
}

提前谢谢了!

标签: phphtmldomdocument

解决方案


要在 php 中使用DOMDocument,您可能会发现有用的 php-xml模块。

我无法想象您为什么要使用自定义标签,但您可以将 div-s 用作纯文本。要正确关闭标签,请使用数据结构堆栈(有一个模块可以处理数据结构,但您可能需要自己的“较小”模块)。

<div> - 将元素添加到堆栈

</div> - 删除一个。

最后以这种方式解析整个输入文本。


推荐阅读