WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Вопрос по str_replace() и перенос строки

Нужно было заменить на сайте

  • <div><p> на <div><p class="my_class">
  • <blockquote><p> на <blockquote><p class="my_class">

Со вторым проблем не возникло, но первый фрагмент не менялся, т.к. между тегами был перенос строки \n.

Решил что

$text = str_replace( '<div>\n<p>', '<div><p class="my_class">', $text);

решит проблему, но этот код не сработал. Далее пробывал

$text = preg_replace( '/<div><p>/x', '<div><p class="my_class">', $text);

где x модификатор, который как я понял, игнорирует переносы строк. Но тоже не помогло.

И только код

$text = str_replace( '<div>'.chr(10).'<p>', '<div><p class="my_class">', $text);

отработал как надо.

Всё равно интересно узнать почему первые два способа не сработали, а третий сработал, как я думал это одно и тоже? Благодарю за комментарии.

0
mi13
1 месяц назад 56
  • 1
    Kama8256

    Для первого варианта нужно было использовать двойные кавычки. Только они в PHP обрабатывают спец символы в строке. Т.е. нужно так:

    $text = str_replace( "<div>\n<p>", '<div><p class="my_class">', $text);

    Второй вариант с регуляркой вообще не то - модификатор x говорит о том что не нужно учитывать пробелы и переносы строк в самой регулярке. Т.е. он создан для удобства чтобы можно было писать регулярки с дополнительными пробелами и переносами строк, которые никак не участвуют в самом регулярном выражении. Например: /< div > < p >/x = /<div><p>/.

    Тут тебе нужно было указать сам перенос, а не модификатор.

    $text = preg_replace( '/<div>\n<p>/', '<div><p class="my_class">', $text );
    // или так
    $text = preg_replace( '/<div>\s<p>/', '<div><p class="my_class">', $text );
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация