WordPress как на ладони

Помогите с регуляркой: нужно внутри тега P строку обернуть в SPAN

$text = preg_replace( '/<p>(.+?)(Текст)/ui', '<p>$1<span>$2</span>', $text, 1 );

Если $text = <p><em>Текст</em><p> то все норм, а если <p><em>Лишнее</em>Текст<p>, то не работает.

Заметки к вопросу:
mi13 1.4 года назад

Оказалось дело в пробелах почему-то, как я понял

$text = preg_replace( '/<p>(.+?)(Текст)/sui', '<p>$1<span>$2</span>', $text, 1 );
mi13 1.4 года назад

Теперь встала другая проблема - жадность.
Если $text = Текст то все норм, а если ...ЛишнееТекст, то не работает. Пробывал поменять (.+?) на ([^p]+?) работает до тех пор пока в тексте не появится англ. буква p . Подскажите кто шарит в регах

т.е. Нужно чтобы в шаблон не попадали теги p которые между начальным тегом p который мы ищем и $search (Текст) которую тоже ищем. Спасибо.

0
mi13
1.4 года назад 87
  • 0

    Если нужно внутри тега p строку "Текст" обернуть в span, то можно просто:

    $text = "<p><em>Всяко</em>РазноТекстЧто угодно<b>Жирно</b></p>";
    $text = preg_replace( '/<p>(.*)(Текст)(.*)<\/p>/i', '<p>$1<span>$2</span>$3</p>', $text, 1 );

    Если что-то другое, то опишите словами, что именно нужно.

    mi13 1.4 года назад

    Благодарю за ответ. Так это так и должно как бы работать, но работает не всегда...
    Если то, что мы ищем далеко в низу текста, то.. в (.*) попадет куча других абзацев вместе с содержимым. Поэтому конструкция [^p] спасает от такой ситуации, но не всегда. Написал об этом выше.

    rino 1.4 года назад

    Понятно. Тогда нужно с обеих сторон от текста лечить от жадности:

    $text = "<p><em>Всяко</em>РазноТекстЧто угодно<b>Жирно</b></p><p><em>Второй</em>Текст<b>Абзац</b></p>";
    $text = preg_replace( '#<p>(.*?)(Текст)(.*?)</p>#i', '<p>$1<span>$2</span>$3</p>', $text, 1 );
    rino 1.4 года назад

    А если убрать четвертый параметр, то и во всех других абзацах Текст обернет span'ами.
    Ну еще можно делать все квантификаторы ленивыми (нежадными) с пом. опции U:

    $text = preg_replace( '#<p>(.*)(Текст)(.*)</p>#Ui', '<p>$1<span>$2</span>$3</p>', $text, 1 );
    mi13 1.4 года назад

    Пробовал все перечисленное, результат тотже. Пока реализовал задумку скриптом, если интересно - вот пример работы. Нужно перейти в запись на странице пойска ).

    rino 1.4 года назад

    Было бы проще понять, если бы был пример - достаточный кусок текста и что в нем нужно сделать.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация