Вывести 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 шт):
На самом деле вопрос интересен и существует множество способов решения, довольно интересный способ с точки зрения написания кода - это проверка различного набора символов путем цикла, но это трудоемкий процесс, который потребует много ресурсов, что лишает этот вариант смысла, по крайней мере в реальном проекте, когда есть аналогичные решения не требующие большого объема вычислительной мощности.
В Вашем случаи идеально подойдет 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, то есть после второго тега параграфа будет вставлен нужный нам текст.