создание обёртки для выбранных тегов

171
10 ноября 2018, 08:10

есть html текст в таком формате:

текст
<blockquote style="margin:0 0 0 .8ex">
    123
    <blockquote style="margin:0 0 0 .8ex">
        456
    </blockquote>
</blockquote>

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

текст
<div>спойлер-заголовок</div>
<div class='hidden'>содержимое blockquote</div>

пробовал через php через регулярку сделать, работает, но только с одним тегом, если появится вложенный, то регулярка "поймает" именно его и то что мне нужно окажется в родительском blockquote. вот регулярка:

 $replacement = "$1<div class='spoiler-title bord'>Показать/скрыть цитату</div><div class='spoiler-content'>$2</div>$3";
 return preg_replace("/(.*)(<blockquote.*<\/blockquote>)(.*)/", $replacement, $mess);

пока делал подумал может лучше это сделать на js, но так же возникли трудности с выбором элементов среди родителей которых нет этих же самых тегов.

в итоге 2 вопроса:

  1. как лучше сделать?
  2. как поправить регулярку что бы она захватывала внешний тег / как выбрать только родительские теги с помощью jquery
Answer 1

Если я правильно понял, то как-то так:

$mess = '
текст
<blockquote style="margin:0 0 0 .8ex">
    123
    <blockquote style="margin:0 0 0 .8ex">
        456
    </blockquote>
</blockquote>
999';

 $replacement = "<div class='spoiler-title bord'>Показать/скрыть цитату</div><div class='spoiler-content'>$1</div>";
 $test = preg_replace("/(<blockquote.*<\/blockquote>)/s", $replacement, $mess);
 // Если не должно быть родительского <blockquote>, то так:
 //$test = preg_replace("/<blockquote.*?>(.*)<\/blockquote>/s", $replacement, $mess);
 var_dump($test);

Результат:

текст
<div class='spoiler-title bord'>Показать/скрыть цитату</div><div class='spoiler-content'>
  <blockquote style="margin:0 0 0 .8ex">
      123
      <blockquote style="margin:0 0 0 .8ex">
          456
      </blockquote>
  </blockquote>
</div>
999
Answer 2

Если я правильно понял, то так:

$string = 'текст
<blockquote style="margin:0 0 0 .8ex">
    123
    <blockquote style="margin:0 0 0 .8ex">
        456
    </blockquote>
</blockquote>';

echo preg_replace_callback('~<blockquote[^>]+>(.*)<\/blockquote>~si', function ($m) {
    return '
        <div class="spoiler-title bord">View/hide</div
        <div class="hidden">'.$m[1].'</div>
    ';
}, $string);

Результат:

текст
<div class="spoiler-title bord">View/hide</div>
<div class="hidden">
    123
    <blockquote style="margin:0 0 0 .8ex">
        456
    </blockquote>
</div>
READ ALSO
Как скрыть верхушку виджета?

Как скрыть верхушку виджета?

Тобишь нужно скрыть верхушку у самописного диалогового окна (там где заголовок, кнопка выхода)При этом такая конструкция при инициализации...

137
Класс для использования в list

Класс для использования в list

Есть два класса:

223
Как применять координатные преобразования к региону в GDI+?

Как применять координатные преобразования к региону в GDI+?

В этой статье приведена следующая информация:

178