Вывести html после 3-го

есть код который выводит модуль (html) после первого </p>

<?php  
    //Полный текст материала
    $item_fulltext = $this->item->fulltext;
    //модуль, который необходимо вывести
    $shapeexpert_module = JHtml::_('content.prepare', '[module-246]'); 
    //находим первый закрывающий тег </p>
    $pos = strpos($item_fulltext,'</p>', 1); 
    //отделяем первый абзац от 0 до номера позиции.
    //Вставляем модуль, и вставим вторую половину текста.
    echo $result_text = substr($item_fulltext,0,$pos)  .  $shapeexpert_module .  substr($item_fulltext,$pos); 
?>  

Как вывести модуль, скажем, после 3-го </p>. Благодарю!


Ответы (1 шт):

Автор решения: ZerxaFun aKa Zerxa

На самом деле вопрос интересен и существует множество способов решения, довольно интересный способ с точки зрения написания кода - это проверка различного набора символов путем цикла, но это трудоемкий процесс, который потребует много ресурсов, что лишает этот вариант смысла, по крайней мере в реальном проекте, когда есть аналогичные решения не требующие большого объема вычислительной мощности.

В Вашем случаи идеально подойдет documentElement, нет - это не JS.

<?php
$pastText = 'Текст, который был вставлен после первого тега параграфа';

$html = <<<'EOD'
<h1>Вставляем текст после первого тега <p></p></h1>
<p>Первый тег параграфа</p>
<p>Второй тег параграфа</p>
<p>Третий тег параграфа</p>
EOD;

libxml_use_internal_errors(true);

$dom = new DOMDocument;
$dom->loadHTML('<div>' . $html . '</div>', LIBXML_HTML_NOIMPLIED);

libxml_clear_errors();

$xp = new DOMXPath($dom);

$targetNode = $xp->query('//h1/following-sibling::p[2]');

if ($targetNode->length) {
    $targetNode = $targetNode->item(0);
    $newNode = $dom->createElement('div', $pastText);
    $targetNode->parentNode->insertBefore($newNode, $targetNode->nextSibling);
    $targetNode->parentNode->insertBefore($dom->createTextNode("\n"), $targetNode->nextSibling);
}

$result = '';
foreach ($dom->documentElement->childNodes as $childNode) {
    $result .= $dom->saveHTML($childNode);
}
echo $result;

$html - наше тело страницы, как я полагаю вместо переменной $html вы можете вставить $this->item->fulltext

$xp->query('//h1/following-sibling::p[2]') с этой строчкой я думаю всё понятно, мы идем по структуре HTML документа, в моем случаи это html->p::2, то есть после второго тега параграфа будет вставлен нужный нам текст.

→ Ссылка