На сайте есть многострочная статья с разделом "содержание" вначале:
<div class="mce-toc">
<ul>
<li><a href="#mcetoc_1cfumeivr2t">Переменные</a>
<ul>
<li><a href="#mcetoc_1cfumeivr2u">Копирование переменных</a></li>
<li><a href="#mcetoc_1cfumeivr2v">Типы переменных</a>
<ul>
...
</div>
Нужно обернуть содержимое блока .mce-toc в другой контейнер. Пытаюсь это сделать с помощью preg_replace, но в ответ приходит NULL. Не пойму в чем причина.
$pattern = '/<div class="mce-toc">((\s|.)*?)<\/div>/mu';
$replacement = '<div class="spoiler">
<a class="spoiler-link" href="">
<span>Содержание</span>
</a>
<div class="spoiler_main">
<div class="spoiler-content">
$1
</div>
</div>
<div class="clearfix"></div>
</div>';
preg_match_all($pattern, $text, $matches, PREG_SET_ORDER, 0);
var_dump($matches); //array(0) { }
var_dump(preg_replace($pattern, $replacement, $text)); //NULL
Думаю это какое то внутреннее ограничение по времени выполнения (или бактреку) функций preg_*. На приведенном вами в комментариях примере реального текста regex101.com показывает 10k шагов выполнения данной регулярки. Немного доработав регулярку получил 1200 шагов. /<div class="mce-toc">(([^<]++|.)*?)<\/div>/mus. При этом php отработал.
Но учитывая такое поведение preg_replace, можно ожидать что на более крупных текстах оно может опять сломаться. Исходя из этого могу порекомендовать вместо регулярок использовать строковые функции поиска и замены.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости