Удалить неподдерживаемые теги HTML (Simple HTML Dom) - PullRequest
0 голосов
/ 30 августа 2018

Я хочу удалить неподдерживаемые теги HTML, вставленные пользователями (система определяет, какой тег поддерживается), пример системы поддерживает только тег " div ":

<div><span>Hello</span> <span>World</span></div>

преобразуется в:

<div>Hello World</div>

Это мой код с простым HTML DOM:

function main()
{
    $content = '<div><span>Hello</span> <span>World</span></div>';

    $html = str_get_html($content);

    $html = htmlParser($html);
}

function htmlParser($html)
{
    $supportedTags = ['div'];

    foreach ($html->childNodes() as $node) {
        // Remove unsupported tags
        if (!in_array($node->tag, $supportedTags)) {
            $node->parent()->innertext = str_replace($node->outertext, $node->innertext, $node->parent()->innertext);
            $node->outertext = '';
        }

        if ($node->childNodes()) {
            htmlParser($node);
        }
    }

    return $html;
}

Но что-то не так, если они содержат несколько вложенных неподдерживаемых тегов, например:

<div><span>Hello</span> <span>World</span> <span><b>!!</b></span></div>

будет преобразовано в

<div>Hello World <b>!!</b></div>

но ожидаемый результат

<div>Hello World !!</div>

Какое решение? Стоит ли продолжать использовать Simple HTML DOM или найти другой способ решения этой проблемы?

Спасибо за продвинутое решение моей проблемы.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

После некоторых трудностей я обнаружил, что не должен редактировать $ node-> parent (), поскольку он находится в цикле и должен сначала загружать childNodes. Код должен быть таким:

function htmlParser($html)
{
    $supportedTags = ['div'];

    foreach ($html->childNodes() as $node) {
        if ($node->childNodes()) {
            htmlParser($node);
        }

        // Remove unsupported tags
        if (!in_array($node->tag, $supportedTags)) {
            $node->outertext = $node->innertext;
        }
    }

    return $html;
}
0 голосов
/ 30 августа 2018

Вы можете сделать это настолько, насколько я понимаю. strip_tags($html, '<div><b>');

Пример : https://3v4l.org/p4nLV


Ссылка : http://php.net/strip_tags

...