@Shimpanze

PHP preg_replace_callback: почему не срабатывает функция?

Здравствуйте!

Пытаюсь обернуть содержимое параграфов из переменной $text, элементом i.

Написал регулярное выражение, которое берет только содержимое параграфов и затем, с помощью callback-функции, оборачиваю это содержимое элементами i.

<?php
  echo preg_replace_callback(
    '/(?<=\<p[^\>]*\>)([\s\S]*)(?=\<\/p\>)/miuU',

    function( $match ) {
      return '<i>' . $match[1] . '</i>';
    },

    $text
);


... но, это регулярное выражение валится с ошибкой: Warning: preg_replace_callback(): Compilation failed: lookbehind assertion is not fixed length at offset 16 in...

Конечно, можно достать отдельно открывающий и закрывающий элементы параграфа и затем вернуть их на место. Но, это будет уже какая-то ерунда, ведь с позитивным просмотром вперед и назад, код получается гораздо чище.

Почему не срабатывает это регулярное выражение именно с функцией preg_replace_callback? И есть ли еще какая-либо возможность в регулярных выражениях, вытащить содержимое элемента параграфа и обработать только его?

Спасибо!
  • Вопрос задан
  • 303 просмотра
Решения вопроса 1
preg_replace(
    '/(\<p[^\>]*\>)(.*)\<\/p\>/miuU',
    '$1<i>$2</i></p>',
    $text
);


или
preg_replace_callback(
    '/(\<p[^\>]*\>)(.*)\<\/p\>/miuU',
    function( $match ) {
        return $match[1] . '<i>' . $match[2] . '</i>' . '</p>';
    },
    $text
);


а проблема в том что у тебя в лукбехайнд выражение не фиксированной длинны, а так нельзя.
вот хороший сайт чтоб с регулярками эксперементировать regex101.com
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы