Помогите с регуляркой
$text = preg_replace( '/<p>(.+?)(Текст)/ui', '<p>$1<span>$2</span>', $text, 1 );
Если $text = <p><em>Текст</em><p>
то все норм, а если <p><em>Лишнее</em>Текст<p>
, то не работает.
Оказалось дело в пробелах почему-то, как я понял
$text = preg_replace( '/<p>(.+?)(Текст)/sui', '<p>$1<span>$2</span>', $text, 1 );
Теперь встала другая проблема - жадность.
Если $text = Текст то все норм, а если ...ЛишнееТекст, то не работает. Пробывал поменять (.+?) на ([^p]+?) работает до тех пор пока в тексте не появится англ. буква p . Подскажите кто шарит в регах
т.е. Нужно чтобы в шаблон не попадали теги p которые между начальным тегом p который мы ищем и $search (Текст) которую тоже ищем. Спасибо.
Если нужно внутри тега p строку "Текст" обернуть в span, то можно просто:
Если что-то другое, то опишите словами, что именно нужно.
Благодарю за ответ. Так это так и должно как бы работать, но работает не всегда...
Если то, что мы ищем далеко в низу текста, то.. в (.*) попадет куча других абзацев вместе с содержимым. Поэтому конструкция [^p] спасает от такой ситуации, но не всегда. Написал об этом выше.
Понятно. Тогда нужно с обеих сторон от текста лечить от жадности:
А если убрать четвертый параметр, то и во всех других абзацах Текст обернет span'ами.
Ну еще можно делать все квантификаторы ленивыми (нежадными) с пом. опции U:
Пробовал все перечисленное, результат тотже. Пока реализовал задумку скриптом, если интересно - вот пример работы. Нужно перейти в запись на странице пойска ).
Было бы проще понять, если бы был пример - достаточный кусок текста и что в нем нужно сделать.