Скрипт вставки блока в текст на PHP

SN
На сайте с 04.07.2013
Offline
84
535

Подскажите пожалуйста, как проще и лучше сделать с точки зрения производительности на PHP.

Есть примерно такой текст:

<h2>Заголовок первый</h2>

<p>текст</p>

<h2>Заголовок второй</h2>

<p>текст</p>

<h2>Заголовок третий</h2>

<p>текст</p>

Я хочу перед вторым заголовком вставить это:

<div></div>

чтобы получилось примерно такое:

<h2>Заголовок первый</h2>

<p>текст</p>

<div></div>

<h2>Заголовок второй</h2>

<p>текст</p>

<h2>Заголовок третий</h2>

<p>текст</p>

Как это лучше всего реализовать?

Спасибо!

M3
На сайте с 29.01.2013
Offline
30
#1
с точки зрения производительности

можно вообще не париться, правда.

PHP 5.6 и 7 дают такие показатели по скорости, что можно расслабиться.

JS (jQuery это тоже можно сделать) выполнит это менее, чем за 1мс.

Например так:


$('h2:eq(1)').prepend('<div></div>');

Не забывайте, мы не в 2009.

L
На сайте с 07.12.2007
Offline
351
#2


$str = "<h2>Заголовок первый</h2>
<p>текст</p>
<h2>Заголовок второй</h2>
<p>текст</p>
<h2>Заголовок третий</h2>
<p>текст</p>";

$arr = explode('<', $str); // В массив по началу тэга(открывающего и закрывающего)
array_splice($arr, 5, 0, array('div>', "/div>\n") ); // <h2>, </h2>, <p>, </p> - 4 тэга,
// значит вставлять надо на 5-е место
echo implode('<', $arr); // Собираем массив обратно в строку, объединяя через '<';
// именно поэтому div добавлялись без ведущего <
SN
На сайте с 04.07.2013
Offline
84
#3
marc3d:
можно вообще не париться, правда.

PHP 5.6 и 7 дают такие показатели по скорости, что можно расслабиться.

JS (jQuery это тоже можно сделать) выполнит это менее, чем за 1мс.
Например так:


$('h2:eq(1)').prepend('<div></div>');


Не забывайте, мы не в 2009.

Спасибо, но нужно именно на PHP

---------- Добавлено 13.09.2016 в 17:27 ----------

Ladycharm:

$str = "<h2>Заголовок первый</h2>
<p>текст</p>
<h2>Заголовок второй</h2>
<p>текст</p>
<h2>Заголовок третий</h2>
<p>текст</p>";

$arr = explode('<', $str); // В массив по началу тэга(открывающего и закрывающего)
array_splice($arr, 5, 0, array('div>', "/div>\n") ); // <h2>, </h2>, <p>, </p> - 4 тэга,
// значит вставлять надо на 5-е место
echo implode('<', $arr); // Собираем массив обратно в строку, объединяя через '<';
// именно поэтому div добавлялись без ведущего <

Дело в том, что количество тегов до второго заголовка предсказать невозможно. Я привел сильно упрощенный вариант. Известно только что перед вторым открывающим тегом <h2> должен появиться блок <div></div>. Вроде задача простая, но я не могу понять в каком направлении думать. Хотелось бы проще.

M
На сайте с 04.12.2013
Offline
223
#4

А не вариант по месту хоть какой-нить шорткод запилить?

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
K0
На сайте с 01.09.2016
Offline
72
#5

Не идеально, но вроде работает:

<?
$pattern = "<H2>";
$str = "<h2>Заголовок первый</h2>
<p>текст</p>
<h2>Заголовок второй</h2>
<p>текст</p>
<h2>Заголовок третий</h2>
<p>текст</p>";

$pos = stripos($str,$pattern);
if (!($pos === false))
{
$pos = stripos($str,$pattern,$pos+1);
if (!($pos === false))
{
$str = substr_replace($str,"<div></div><h2>",$pos,strlen($pattern));
print($str);
}
}
?>
J
На сайте с 20.02.2014
Offline
120
jkm
#6

Достаточно чуть доработать вариант предложенный Ladycharm. Нужно делить не по "<" а "<h2" и ограничить количество получаемых частей.


$arr = explode('<h2', $str, 3);
$arr[1] .= "<div></div>\n";
echo implode('<h2', $arr);

Еще можно регулярным выражением


echo preg_replace('/<h2.+?\K<h2/is', "<div></div>\n\\0", $str, 1);
SN
На сайте с 04.07.2013
Offline
84
#7


$arr = explode('<h2', $str, 3);
$arr[1] .= "<div></div>\n";
echo implode('<h2', $arr);

Спасибо! Этот вариант оказался самым простым и понятным для меня! Все работает!

L
На сайте с 07.12.2007
Offline
351
#8

jkm, красиво получилось. Я сначала тоже по <h2> разбивала в массив, но не сообразила приклеить <div></div> к элементу массива, а вставляла его отдельным элементом.

В своём проекте - делала бы костыль "регуляркой". Но она не "прозрачна", а тут - всего 3 простых и понятных строчки. И работать будут надёжно, как танк.

PS: Вы, похоже, создаёте читабельные и чётко работающие скрипты. Ясно к кому за подмогой можно обращаться :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий