За последние 24 часа нас посетили 15059 программистов и 1763 робота. Сейчас ищет 1491 программист ...

вывод текста из базы "как есть"

Тема в разделе "Вопросы от блондинок", создана пользователем Unicorn, 25 дек 2013.

  1. Unicorn

    Unicorn Новичок

    С нами с:
    13 дек 2013
    Сообщения:
    20
    Симпатии:
    0
    Есть база, в одном из полей хранится текст, пара абзацев, с кавычками, слешами, переводами строк и т.п.
    Мне надо этот текст выводить на экран так, как он есть. Обычное echo $text выдаёт всё в подбор, без переносов строк.
    Использование <pre> во первых, растягивает страничку даже не смотря на то, что размер блока, в котором выводится, жестко указан. И во вторых, меняет шрифт.
    При просмотре кода странички этот текст показан с переносами.

    Сохранение кавычек и тегов вроде сделала, а перенос строк - не могу сообразить :(
    Использование формы <textarea> тоже как-то кажется не совсем правильным решением. Хотя так оно отображается, как надо :)
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    При сохранении текста в базу обрабатывайте не только кавычки, но и \r\n. И при выбросе из базы так и отдавайте. Браузеры прекрасно понимают \r\n, переданный в виде текста вместе с контентом.
     
  4. semnt

    semnt Новичок

    С нами с:
    25 дек 2013
    Сообщения:
    93
    Симпатии:
    0
    Можно попробовать перед выводом заменять переносы строк на <br />
    Код (Text):
    1.  
    2. $text = preg_replace( "#\r?\n#", "<br />", $text );
    3. echo $text;
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Завязывайте вы регулярками заменять символы, когда нет сложных условий замены. Такие вещи делаются обычным str_replace. И да, менять \r\n на br не нужно. \r\n есть \r\n.
     
  6. semnt

    semnt Новичок

    С нами с:
    25 дек 2013
    Сообщения:
    93
    Симпатии:
    0
    Согласен с Вами, но в этой регулярке есть условие замены)
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    str_replace(array("\r\n","\r",'йадЪ','перевод_строки_ололо'),'<br>'); сделает то же самое, но быстрее и дешевле, другое дело, что замена на выводе просто-напросто не нужна в данном случае и лишь сотрясает воздух, то бишь впустую ест такты процессора.
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.097
    Симпатии:
    1.241
    Адрес:
    там-сям
    откройте для себя nl2br() и устыдитесь )))

    а вообще не надо этого, а надо делать htmlspecialchars(), затем выводить всё в <pre> </pre> чтобы переводы строк, пробелы и все дела работали
     
  9. Unicorn

    Unicorn Новичок

    С нами с:
    13 дек 2013
    Сообщения:
    20
    Симпатии:
    0
    <pre> я первым делом пробовала. После него браузер в ширину раздаётся на десять экранов :D

    И регулярками не пользуюсь, так как тупо не понимаю их. Str_replace пока хватает. Я бы и его использовала для переноса строк, но какой символ менять на перенос - понять не могу. Ну нету там \r\n. Обычный текст.
    И ведь оно же при просмотре кода с переносами показывается :)


    Устыдилась :) Вставила в код и обрадовалась :D В поисковиках одно экранирование было, а про эту возможность ну совсем никак не попадалось.

    Спасибо! Проблема решена!
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.097
    Симпатии:
    1.241
    Адрес:
    там-сям
    это решается с помощью CSS
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Разумеется таких буковок там нету. Это обозначения новой строки и перевода каретки. А вот они - есть.
     
  12. semnt

    semnt Новичок

    С нами с:
    25 дек 2013
    Сообщения:
    93
    Симпатии:
    0
    nl2br не заменяет переводы строк, а добавляет перед ними <br />
    Код (Text):
    1.  
    2. nl2br( "text \r\n text \n text" ) >>> "text <br />\r\n text <br />\n text"
    Я считаю, что одна строка не может быть велосипедом.
    И привык держать происходящее под контролем. А если мне нужно заменить на <br> (без слеша)?

    И если я выбрал PHP, то производительность меня не волновала в принципе)
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Скажешь потом это своему хостеру и пользователям, когда сервак будет падать от 100 посещений. Если php работает не со скоростью C++, это не значит, что можно на расходы ресурсов смело болт забивать.

    И да, черт возьми, неужели никто не слышит, что не нужно заменять символ переноса br-ами? Браузеры давно понимают символ переноса нативно.
     
  14. semnt

    semnt Новичок

    С нами с:
    25 дек 2013
    Сообщения:
    93
    Симпатии:
    0
    Да ладно Вам от одной маленькой (и беззащитной) регулярочки ничего не упадёт, а решение красивое, гибкое и главное - оно объясняет, что нужно делать. А вариант реализации пусть выбирает сам разработчик.

    Добавлено спустя 33 минуты 17 секунд:
    А можно подробнее?
    Вот в примере 4 браузера не понимают разрыв. IE9, остальные все новые.
    http://take.ms/RiMMh
    Точнее они считают разрыв как пробел.
    Что не так в примере?
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    1) Я имел ввиду мальца не это;
    2) Вскрыл свой модуль, где есть такой вывод, да, у меня там просто правильно отcss-енный <pre>. Окай. Давно туда не лазил и начал воспринемать его поведение как должное.
    3) Регулярка не нужна. Даже в документации написано, что юзать регулярки для таких задач - моветон.
     
  16. Unicorn

    Unicorn Новичок

    С нами с:
    13 дек 2013
    Сообщения:
    20
    Симпатии:
    0
    А с этого места поподробней.

    У меня в стилях
    #main_field {
    width: 600px;
    }

    В HTML
    <div id="main_field">
    <pre>
    <? echo $text; ?>
    </pre>
    </div>

    И это - разносит браузер.

    Далее, в HTML оформляю дополнительно таблицу (идёт вывод данных в таблицу)
    <div id="main_field">
    <TABLE width=90%>
    <tr><td>
    <pre>
    <? echo $text; ?>
    </pre>
    </td></tr>
    </TABLE>
    </div>
    И всё равно - разносит на несколько экранов.


    Если бы понимали, вопрос не появился бы, не?
    И делать код, который будет работать ТОЛЬКО в последних версиях браузера - ИМХО неумно.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.769
    Адрес:
    :сердА
    Снято с повестки постом выше, потому что это я налажал.