Добавить HTML-тег в строку в PHP - PullRequest
       31

Добавить HTML-тег в строку в PHP

0 голосов
/ 04 сентября 2018

Я хотел бы добавить HTML-тег в строку HTML в PHP, например:

<h2><b>Hello World</b></h2>
<p>First</p>
Second
<p>Third</p>

Секунда не заключена ни в один элемент HTML, поэтому система добавит в него тег p, ожидаемый результат:

<h2><b>Hello World</b></h2>
<p>First</p>
<p>Second</p>
<p>Third</p>

Пробовал с PHP Simple HTML DOM Parser, но понятия не имею, как с этим бороться, вот мой пример идеи:

function htmlParser($html)
{
    foreach ($html->childNodes() as $node) {
        if ($node->childNodes()) {
            htmlParser($node);
        }
        // Ideally: add p tag to node innertext if it does not wrapped with any tag
    }

    return $html;
}

Но childNode не будет зацикливаться на Second , потому что внутри него нет обернутого элемента, и regex не рекомендуется иметь дело с тегом html, есть идеи?

Большое спасибо, спасибо.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Использовал глупый способ решения этой проблемы, вот мой код:

function addPTag($html)
{
    $contents = preg_split("/(<\/.*?>)/", $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    foreach ($contents as &$content) {
        if (substr($content, 0, 1) != '<') {
            $chars = preg_split("/(<)/", $content, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
            $chars[0] = '<p>' . $chars[0] . '</p>';
            $content = implode($chars);
        }
    }

    return implode($contents);
}

Надеюсь, что есть и другой элегантный способ, спасибо.

0 голосов
/ 06 сентября 2018

Это был классный вопрос, потому что он продвигал мысль о DoM.

Я поднял вопрос Как парсеры HTML обрабатывают текст без тегов , который был щедро прокомментирован @ sideshowbarker , что заставило меня задуматься и улучшило мои знания о DoM, особенно о тексте узлы.

Ниже представлен способ, основанный на DoM, для поиска подходящих текстовых узлов и дополнения их тегами 'p'. Есть много текстовых узлов, которые мы должны оставить в покое, например, пробелы, возвраты каретки и переводы строк, которые мы используем для форматирования (который может убрать "uglifier").

<?php

$html = file_get_contents("nodeTest.html"); // read the test file
$dom = new domDocument;            // a new dom object
$dom->loadHTML($html);             // build the DoM
$bodyNodes = $dom->getElementsByTagName('body');  // returns DOMNodeList object
foreach($bodyNodes[0]->childNodes as $child)      // assuming 1 <body> node
{
    $text="";
    // this tests for an untagged text node that has more than non-formatting characters
    if ( ($child->nodeType == 3) && ( strlen( $text = trim($child->nodeValue)) > 0 ) )
    { // its a candidate for adding tags
        $newText = "<p>".$text."</p>";  
        echo str_replace($text,$newText,$child->nodeValue);
    }
    else
    {   // not a candidate for adding tags
        echo $dom->saveHTML($child);
    }
}     

nodeTest.html содержит это.

<!DOCTYPE HTML> 
<html>
<body>
    <h2><b>Hello World</b></h2>
    <p>First</p>
    Second
    <p>Third</p>
    fourth
    <p>Third</p>
    <!-- comment -->
</body>
</html>

и вывод такой ... Я не удосужился повторить внешние теги. Обратите внимание, что комментарии и форматирование обрабатываются правильно.

<h2><b>Hello World</b></h2>
<p>First</p>
<p>Second</p>
<p>Third</p>
<p>fourth</p>
<p>Third</p>
<!-- comment -->

Очевидно, вам нужно пройти через DoM и повторить поиск / замену в каждом элементе узла, если вы хотите сделать вещь более общей. В этом примере мы останавливаемся только на узле Body и обрабатываем каждый прямой дочерний узел.

Я не уверен на 100%, что код наиболее эффективен, и я могу подумать над этим и обновить, если найду лучший способ.

0 голосов
/ 04 сентября 2018

Вы можете попробовать Простой HTML Dom Parser

$stringHtml = 'Your received html';

$html = str_get_html(stringHtml);

//Find necessary element and edit it
$exampleText = $html->find('Your selector here', 0)->last_child()->innertext
...