Нет причины звонить preg_quote()
, и это мешает (.*?)
рассматриваться как шаблон. И вместо того, чтобы поместить группу захвата вокруг .*?
, вы можете поместить ее вокруг всего до того, как потребуется второй </div>
.
$output = preg_replace('#(<div class="phraserec".*?</div>)</div>#', '$1', $source);
preg_quote()
, если вы хотите превратить динамический ввод в литералзначение в регулярном выражении.