За последние 24 часа нас посетили 43760 программистов и 1813 роботов. Сейчас ищут 886 программистов ...

[РЕШЕНО]Замена переносов строки на абзацы.

Тема в разделе "PHP для новичков", создана пользователем Econaft, 1 сен 2015.

Статус темы:
Закрыта.
  1. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Есть функция:

    Код (PHP):
    1. function nl2p($string) {
    2.  $s = ("|\r\n|");
    3.  $d = ("</p>\n<p>");
    4.  $string = "<p>". preg_replace($s, $d, $string) ."</p>";
    5.  $string = str_replace('<p></p>', '', $string);
    6.  return $string;
    7.  }
    Каждый перенос строки она переделывает в новый абзац, т.е. помещает фрагмент текста в теги <p></p>
    Допустим я ввёл текст:

    Код (PHP):
    1.  Бла бла бла и бла бла бла.
    2.  
    3.  Тум пурум пурум пурум.
    4.  
    5.  Ля ля ля.

    Результатом будет:

    Код (PHP):
    1.  <p>Бла бла бла и бла бла бла.</p>
    2.  <p>Тум пурум пурум пурум.</p>
    3.  <p>Ля ля ля.</p>
    В отличие от функции "nl2br" которая создаёт тупо однии <br>, эта функция делает контент более статейным разделяя его как и положено на абзацы.

    Но есть проблема.

    Допустим я хочу чтобы не все новые строчки переделывались в абзацы, чтобы когда два переноса - был обзац, а когда один перенос - был <br>.

    Т.е. если я ввожу вот так (один перенос):

    Код (PHP):
    1.  Бла бла бла и бла бла бла.
    2.  Тум пурум пурум пурум.
    3.  Ля ля ля.
    То эта фунция всё равно мне всё оформит в теги <p></p>:

    Код (PHP):
    1.  <p>Бла бла бла и бла бла бла.</p>
    2.  <p>Тум пурум пурум пурум.</p>
    3.  <p>Ля ля ля.</p>
    А мне нужно чтобы это было как положено, т.е. вот так:

    Код (PHP):
    1.  <p>Бла бла бла и бла бла бла.<br>
    2.  Тум пурум пурум пурум.<br>
    3.  Ля ля ля.</p>
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Код (PHP):
    1. $string = '<p>'.str_replace("\n\n", '</p><p>', $string).'</p>';
    2. $string = str_replace("\n", '<br>', $string);
    3.  
     
  3. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Re: Не могу додалать функцию.

    igordata, благодарю! Просто спас.

    Добавлено спустя 7 минут 51 секунду:
    Всё же не работает ещё до конца правильно.

    Выводит вот это:
    Код (Text):
    1. <p>Стихи поздравления с днём рождения. День рождения — необычный праздник! В этот день на именинника просто льется дождь из подарков, приятных встреч, звонков с поздравлениями и пожеланиями. Как поздравить с днем рождения? Только в стихах! Ведь такие поздравления являются наиболее удачным способом выразить виновнику торжества свои чувства и от души высказать все свои пожелания.
    2. <br>
    3. <br>С днем рождения поздравляю
    4. <br>И хочу тебе сказать,
    5. <br>Что всего-всего желаю:
    6. <br>Никогда не унывать,
    7. <br></p>
    Т.е. обзац образуется, но только один.

    Добавлено спустя 55 секунд:
    Один абзац <p> вначале и в конце и всё.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: Не могу додалать функцию.

    Код (Text):
    1. $string = '<p>'.str_replace(PHP_EOL . PHP_EOL, '</p><p>', $string).'</p>';
    2. $string = str_replace(PHP_EOL, '<br>', $string);
    Добавлено спустя 2 минуты 7 секунд:
    Код (Text):
    1. $string = '<p>'.str_replace(["\r\n\r\n", "\n\n", "\r\r"], '</p><p>', $string).'</p>';
    2. $string = str_replace(["\r\n", "\n", "\r"], '<br>', $string);
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Не могу додалать функцию.

    значит там не "\n\n", а именно "\r\n" или "\n\r"

    это тоже можно заменой привести к одному виду.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: Не могу додалать функцию.

    Будет зависить от ОС пользователя, который вводит текст. Двойной перевод строки \r\n\r\n на винде, \n\n будет на линуксе, \r\r на старых MacOS, а \n\r вообше не используется.
     
  7. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Re: Не могу додалать функцию.

    У меня Виндовс.

    igordata
    пробовал в коде менять "\n\n", на "\r\n" и "\n\r" - не помогло.
    при варианте "\n\r" вставляет br но прямо вместе с <p> одновременно.

    [vs]
    Первый когд тоже не работает.
    А этот выводит ошибку:
    Код (Text):
    1. $string = '<p>'.str_replace(["\r\n\r\n", "\n\n", "\r\r"], '</p><p>', $string).'</p>';
    2. $string = str_replace(["\r\n", "\n", "\r"], '<br>', $string);
    Где-то здесь ошибка.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: Не могу додалать функцию.

    что за ошибка?
     
  9. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Re: Не могу додалать функцию.

    пустая страница
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: Не могу доделать функцию.

    http://phpfaq.ru/debug
    скорее всего старая версия PHP. Вместо квадратных скобок используй array() или обнови php.
     
  11. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Re: Не могу доделать функцию.

    Поставил
    Код (Text):
    1. ini_set('display_errors',1);
    2. error_reporting(E_ALL);
    Но всё равно ошибка пустое окно.

    PHP 5.3
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: Не могу доделать функцию.

    ну я же говорю - старая. Тогда еще нельзя было объявлять массив квадратными скобками, так что это синтаксическая ошибка, а синтаксические ошибки выбрасываются до начала выполнения скрипта, поэтому изменение вывода ошибок в самом скрипте не влияет на их видимость.
     
  13. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Re: Не могу доделать функцию.

    Включил 5.6 у хостера.

    Ошибку не выдаёт, но скрипт создания статей перестал напрочь работать. Пришлось вернуться снова к 5.3. Даже протестить на смог.

    А как с array записать?
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: Не могу доделать функцию.

    Вместо [...] пиши array(...)
     
  15. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Re: Не могу доделать функцию.

    Econaft тебе [vs] дал ссылку, как найти ошибку, как минимум включить их отображение.
     
  16. Econaft

    Econaft Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    89
    Симпатии:
    1
    Re: Не могу доделать функцию.

    [vs]
    Протестил. Всё идеально.
    Спасибо всем!
     
Статус темы:
Закрыта.