Uncategorized

Проблемы с переносом строки в textarea

Наверняка я буду не первым и не последним из тех, кто сталкивался, по неграмотности, с проблемой переноса строк в textarea при записи содержимого в MySQL-базу — все символы переноса строки остаются незамеченными и в базу попадает, по сути, одна большая строка.

Обратившись к великому Гуглу, наковырял, так сказать, изюма из булок — ну и выкладываю засим…

Способ первый (а вдруг повезет):

Как гласит спецификация HTML (поправьте меня, гуру, при ошибке в терминологии), у поля TEXTAREA имеется замечательный атрибут — WRAP, который определяет способ переноса слов в заполняемой данной заполняемой форме. Возможные значения:

  • off — перенос слов не происходит (значение по умолчанию)
  • virtual — перенос слов только отображается, на сервер же поступает неделимая строка.
  • physical — перенос слов будет происходить во всех точках переноса.

Вот, кажется, и панацея нашлась:

Применив на практике сие чудо мысли, заметил, что оно НЕ РАБОТАЕТ. Видимо, по незнанию перепутал переносы слов и строк 🙂 Так вот, данная фича относится именно к переносу слов и никак иначе…

Способ второй. Рабочий.

Так как работаем с базой на языке php (ну, там, селекты, апдейты), то неглупым было бы использовать обычную стандартную функцию языка — nl2br, которая вставляет HTML код разрыва строки перед каждым переводом строки. Делается это приблизительно так:

Естественно, безо всяких мудрствований с дизайном, это уже делайте исходя из собственных соображений. А вот фрагмент файла add.php, куда мы отправляем данные из нашей формы методом POST:

Вот так уже работает. Но есть одно но. Не всех устроит обычный перенос строки, так как не каждому понравится отсутствие интервала между абзацами, поэтому применяем

Способ третий. Доработка напильником.

Гораздо приятнее созерцать текст, введенный через textarea, залитый в базу и отображенный после этого на странице c визуально разделенными абзацами. Тут, далеко ходить не надо, вместо переноса строки лучше «смотрелись» бы абзацы. Вопрос возникает: ведь стандартных функций подобного рода в php не существует. Так почему бы не написать свою… Что и сделали ребята, имена которых нам неизвестны, но все мы им очень благодарны (лично мне они очень помогли в период, когда хотелось результата, но не очень хотелось мозг напрягать 🙂 ).  Вот, значит, их функция с использованием регулярных выражений (это, собсно, доработанный напильником файл add.php):

Еще один бонус, приобретаемый с этой функцией — если несколько переносов строк следуют друг за другом (т.е. пользователь применяет так называемый метод «форматирования абзацами», как это делают тетеньки в пенсионном фонде или просто неграмотные секретари), то функция оставляет только один из них, не нарушая стройности «конструкции».

В общем, пользуйтесь на здоровье, дорогие мои начинающие, или забывшие матчасть, программисты 🙂

26 комментариев

  • @курьер: Размещайте с обратной ссылкой. Тем более, что тут мои наблюдения, а не изобретения 🙂

    @купить авто: параллельный блог есть — http://artlap.ru — круг искусства, неизвестные авторы, креатив. Третий вряд-ли потяну, «делу время, а потехе час», как говорится

    @обоим: уж больно на спам смахивали Ваши каменты, пока я не удалил Ваши url’ки, а так, очень даже конструктивные комментарии получились 🙂

  • Действительно не Вы последний столкнулись с этой проблемой, спасибо за пост )

  • Снегурочка, пожалуйста 🙂 Что, кодим потихоньку, в свободное от ассистирования Деду Морозу время? 🙂

  • вввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввв

  • вот видите с какой проблемой столкнулся! если ввести такое длинное словечко, то корежеться вся страница! Как этого избежать пока не додумался. Думаю на javascript можно сделать подсчет кол-ва символов в строке и добавлять автоматический перенос. Может кто подскажет как это сделать?

  • Вадик. Всё до банальности просто. К чему все эти извращения с php??
    Можно обойтись средствами CSS.
    textarea {word-wrap: break-word; width:100%; left:0; width: 350px;}
    Ширина блока естественно под ваш дизайн, но параметр задать обязательно.

  • В третьем случае пропущен тег

    function nl2p($str) {
    return ‘

    ‘.preg_replace(«/[rn|n|r]+/», «», $str).’

    ‘;
    }

  • В третьем случае нет тега p, т.к. он стерт вашим антиспамером. В результате функция наоборот стирает все переносы строк.

    function nl2p($str) {
    return ‘

    ‘.preg_replace(«/[rn|n|r]+/», «здесь НТМL-тег абзаца Р», $str).’

    ‘;
    }

  • kkkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

  • 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

  • 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112
    2452222222 22222222222242222 22222245222222 2222222 224222222522 2222225222 22224222222 5222222 222222222 2 2 2 45454545454

  • ggdggggggggggggggggddgdgdgdggdgddggddgggddgddggddgdggddggddggddggdgdggdddggdgdgddggggggggggggggggggg ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

  • спс, просто нереально помогло победить символ конца строки для правки конфигов юникс из веба.

  • А как де про sql-инъекции? забыли?
    может у вас и включено «кавычкирование» сервером, а как быть тем у кого не включено?
    mysql_real_escape();

  • Вот сам написал маился нигде не че нет задолбался пришлось думать в принципе это мне больше нравится чем проблемы с дизайном

    function my_proverk2(&$a)
    {
    $a=trim($a);
    $a = strip_tags($a);
    if(!get_magic_quotes_gpc())
    {
    $a=addslashes($a);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //собираю массив и делю данные на отдельные слова затем веду подсчет каждого слова в отдельности и выявляю превышение символов в одном слове////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    $a=str_replace («r»,»», $a);
    $a=str_replace («,»,», «, $a);
    $a=str_replace («, «,», «, $a);
    $a=str_replace («.»,». «, $a);
    $a=str_replace («. «,». «, $a);
    //$a=str_replace («. ru»,».ru», $a);
    //$a=str_replace («. com»,».com», $a);
    //$a=str_replace («. su»,».su», $a);
    //$a=str_replace («. net»,».net», $a);
    //$a=str_replace («. рф»,».рф», $a);
    //$a=str_replace («. org»,».org», $a);
    //$a=str_replace («. www»,».www», $a);
    //$a=str_replace («-«,» — «, $a);
    //$a=str_replace («- «,» — «, $a);
    //$a=str_replace (» -«,» — «, $a);
    $a=str_replace («!»,»! «, $a);
    $a=str_replace («! «,»! «, $a);
    $a=str_replace («:»,»: «, $a);
    $a=str_replace («: «,»: «, $a);
    $a=str_replace («»,»: «, $a);
    $a=str_replace («: «,»: «, $a);
    $a=str_replace («r»,»», $a);
    $b=$a;
    $b = explode (‘ ‘,$b);
    foreach ($b as $denger){
    $b=strlen(«$denger»);

    if($b>58)
    {
    $a2=$a;
    $a2=substr ($a2,0,29);
    $a3=$a;
    $a3=substr ($a3,29);
    $a=$a2.’ ‘.$a3;
    }
    if($b>59) // превышение символов 59 — символо это дохрена!!! =))
    {
    $a=’Нет пробелов между словами, отредактируйте!!!’;// вместо текста занесем вот ето предупреждение
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    }

  • eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

Добавить комментарий