Проблемы с переносом строки в textarea
Наверняка я буду не первым и не последним из тех, кто сталкивался, по неграмотности, с проблемой переноса строк в textarea при записи содержимого в MySQL-базу – все символы переноса строки остаются незамеченными и в базу попадает, по сути, одна большая строка.
Обратившись к великому Гуглу, наковырял, так сказать, изюма из булок – ну и выкладываю засим…
Способ первый (а вдруг повезет):
Как гласит спецификация HTML (поправьте меня, гуру, при ошибке в терминологии), у поля TEXTAREA имеется замечательный атрибут – WRAP, который определяет способ переноса слов в заполняемой данной заполняемой форме. Возможные значения:
- off – перенос слов не происходит (значение по умолчанию)
- virtual – перенос слов только отображается, на сервер же поступает неделимая строка.
- physical – перенос слов будет происходить во всех точках переноса.
Вот, кажется, и панацея нашлась:
<textarea cols="40" rows="3" name="address"> Текст по умолчанию... </textarea>
Применив на практике сие чудо мысли, заметил, что оно НЕ РАБОТАЕТ. Видимо, по незнанию перепутал переносы слов и строк :) Так вот, данная фича относится именно к переносу слов и никак иначе…
Способ второй. Рабочий.
Так как работаем с базой на языке php (ну, там, селекты, апдейты), то неглупым было бы использовать обычную стандартную функцию языка – nl2br, которая вставляет HTML код разрыва строки перед каждым переводом строки. Делается это приблизительно так:
<form action="add.php" method="post"> <textarea cols="60" rows="10" name="description"></textarea> <input type="submit" value="Готово" /> </form>
Естественно, безо всяких мудрствований с дизайном, это уже делайте исходя из собственных соображений. А вот фрагмент файла add.php, куда мы отправляем данные из нашей формы методом POST:
$description = nl2br($_POST['description']); /* Соединяемся с базой данных */ $con = mysql_connect("сервер","база данных","пароль"); if (!$con) { die('Не могу соединиться: ' . mysql_error()); } mysql_select_db("база данных", $con); /* Формируем SQL-запрос */ $sql="INSERT INTO `base` ( description ) VALUES ( '$description' )"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); }
Вот так уже работает. Но есть одно но. Не всех устроит обычный перенос строки, так как не каждому понравится отсутствие интервала между абзацами, поэтому применяем
Способ третий. Доработка напильником.
Гораздо приятнее созерцать текст, введенный через textarea, залитый в базу и отображенный после этого на странице c визуально разделенными абзацами. Тут, далеко ходить не надо, вместо переноса строки лучше «смотрелись» бы абзацы. Вопрос возникает: ведь стандартных функций подобного рода в php не существует. Так почему бы не написать свою… Что и сделали ребята, имена которых нам неизвестны, но все мы им очень благодарны (лично мне они очень помогли в период, когда хотелось результата, но не очень хотелось мозг напрягать :) ). Вот, значит, их функция с использованием регулярных выражений (это, собсно, доработанный напильником файл add.php):
// [+] ФУНКЦИЯ ЗАМЕНЫ ПЕРЕНОСОВ СТРОКИ НА ПАРАГРАФЫ function nl2p($str) { return ' '.preg_replace("/[\r\n|\n|\r]+/", " ", $str).' '; } // [-] ФУНКЦИЯ ЗАМЕНЫ ПЕРЕНОСОВ СТРОКИ НА ПАРАГРАФЫ $description = nl2p($_POST['description']); /* Соединяемся с базой данных */ $con = mysql_connect("сервер","база данных","пароль"); if (!$con) { die('Не могу соединиться: ' . mysql_error()); } mysql_select_db("база данных", $con); /* Формируем SQL-запрос */ $sql="INSERT INTO `base` ( description ) VALUES ( '$description' )"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); }
Еще один бонус, приобретаемый с этой функцией – если несколько переносов строк следуют друг за другом (т.е. пользователь применяет так называемый метод «форматирования абзацами», как это делают тетеньки в пенсионном фонде или просто неграмотные секретари), то функция оставляет только один из них, не нарушая стройности «конструкции».
В общем, пользуйтесь на здоровье, дорогие мои начинающие, или забывшие матчасть, программисты :)

Подскажите, можно ли разместить на своем сайте данный пост?
[Ответить]
А Вы не задумывались о том, чтобы параллельно завести еще один блог
[Ответить]
@курьер: Размещайте с обратной ссылкой. Тем более, что тут мои наблюдения, а не изобретения :)
@купить авто: параллельный блог есть – http://artlap.ru – круг искусства, неизвестные авторы, креатив. Третий вряд-ли потяну, «делу время, а потехе час», как говорится
@обоим: уж больно на спам смахивали Ваши каменты, пока я не удалил Ваши url’ки, а так, очень даже конструктивные комментарии получились :)
[Ответить]
Действительно не Вы последний столкнулись с этой проблемой, спасибо за пост )
[Ответить]
Снегурочка, пожалуйста :) Что, кодим потихоньку, в свободное от ассистирования Деду Морозу время? :)
[Ответить]
вввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввв
[Ответить]
den отвечает (Июль 12th, 2011 в 17:03):
Спасибо, Вадик, огромное )) Взял и порвал страницу ))
[Ответить]
вот видите с какой проблемой столкнулся! если ввести такое длинное словечко, то корежеться вся страница! Как этого избежать пока не додумался. Думаю на javascript можно сделать подсчет кол-ва символов в строке и добавлять автоматический перенос. Может кто подскажет как это сделать?
[Ответить]
Вадик. Всё до банальности просто. К чему все эти извращения с php??
Можно обойтись средствами CSS.
textarea {word-wrap: break-word; width:100%; left:0; width: 350px;}
Ширина блока естественно под ваш дизайн, но параметр задать обязательно.
[Ответить]
Простите забыл. В HTML код textarea добавить атрибут wrap=»on».
[Ответить]
В третьем случае пропущен тег
function nl2p($str) {
return ‘
‘.preg_replace(«/[\r\n|\n|\r]+/», «», $str).’
‘;
}
[Ответить]
В третьем случае нет тега p, т.к. он стерт вашим антиспамером. В результате функция наоборот стирает все переносы строк.
function nl2p($str) {
return ‘
‘.preg_replace(«/[\r\n|\n|\r]+/», «здесь НТМL-тег абзаца Р», $str).’
‘;
}
[Ответить]
Волшебный пост! Мне очень помого :)
[Ответить]
den отвечает (Ноябрь 1st, 2011 в 13:44):
@Tureg1, я не волшебник, у только учусь (…краснея…)
[Ответить]
kkkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
[Ответить]
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
[Ответить]
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112
2452222222 22222222222242222 22222245222222 2222222 224222222522 2222225222 22224222222 5222222 222222222 2 2 2 45454545454
[Ответить]
ggdggggggggggggggggddgdgdgdggdgddggddgggddgddggddgdggddggddggddggdgdggdddggdgdgddggggggggggggggggggg ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
[Ответить]
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
[Ответить]
den отвечает (Ноябрь 15th, 2011 в 22:47):
@jjkjmkmjm, очень, бля, умно…
[Ответить]
спс, просто нереально помогло победить символ конца строки для правки конфигов юникс из веба.
[Ответить]
А как де про sql-инъекции? забыли?
может у вас и включено «кавычкирование» сервером, а как быть тем у кого не включено?
mysql_real_escape();
[Ответить]
Пардонте…
недописал
mysql_real_escape_string()
[Ответить]
Оставить комментарий или два (можно даже вставить видео в комментарий)
Самое комментируемое
Ресурсы: Размещение ссылок и продвижение сайта | развитие внутреннего туризма