|
|
|
| Здравствуйте!
Не могу найти решение этой задачи:
На странице есть форма с полем "textarea" с шириной в 300 пикселей.
Пользователь вводит текст (скажем: три предложение на 300 символов; небольшой список из трёх строчек с нумерацией; одно предложение на 70 символов) при этом он первые три предложения пишет без переноса строки, то есть в поле "textarea" если текст дошёл до стенки поля, то он автоматический переноситься на следующую строку. Но когда дела доходит до списка, то пользователь уже самостоятельно переносит следующий пункт списка на следующею строку.
И вся эта информация заносится в БД.
А проблемы появляются при выводе этих данных на экран.
Если вытащить их в контейнер див шириной в 300 пикселей, то текст получится однообразным (без списка) зато в рамках контейнера.
Если поместить его в тэг <pre> то первые три предложения которые пользователь написал в один ряд, выйдут за пределы дива и экрана.
Если вывести через такую регулярку: $newtext = wordwrap($text, 80, "<br/>"); то может случится так, что второй пункт списка будет разбит на две строки хотя там всего два слова.
Как решаются такие задачи?
Как вытащить текст чтобы он не выходил за рамки контейнера див при этом сохранил список в том виде в котором его ввел пользователь. | |
|
|
|
|
|
|
|
для: sasha12342
(11.02.2013 в 19:45)
| | Возможно вас заинтересует функция wordwrap(). | |
|
|
|
|
|
|
|
для: cheops
(11.02.2013 в 20:53)
| | Если вытащить их в контейнер див шириной в 300 пикселей, то текст получится однообразным (без списка) зато в рамках контейнера.
Если поместить его в тэг <pre> то первые три предложения которые пользователь написал в один ряд, выйдут за пределы дива и экрана.
Если вывести через такую регулярку: $newtext = wordwrap($text, 80, "<br/>"); то может случится так, что второй пункт списка будет разбит на две строки хотя там всего два слова. | |
|
|
|
|
|
|
|
для: sasha12342
(11.02.2013 в 23:11)
| | Могу предложить такой вариант:
<?php
$s = <<<TEXT
asdf sadfsadfasdf asdfasdfadsf sadfasdfasd fsadfadsf asdfasdfasd asdfsadf asdfsadf
- sadfsadfasdfadsf asfasdfasd asdfasdf sadfasdfasd
- asdfdsaf sadfasdfsad
TEXT;
$s = explode("\n",str_replace("\r",'',$s));
array_walk($s,create_function('&$a','$a = wordwrap($a,80,"<br>");'));
$s = implode('<br>',$s);
echo "<pre>$s</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(12.02.2013 в 11:25)
| | Не получается. Некоторые строки содержат всего по одной букве.
Текст должен выглядеть так:
1слово 2слово 3слово 4слово
5слово. 1слово 2слово 3слово
4сово 5слово. 1слово 2слово
3слово 4слово 5слово.
1) два слова
2) два слова
3) два слова
А выглядит так:
1слово 2слово 3слово 4слово
5слово.
1слово 2слово 3слово 4сово
5слово.
1слово 2слово 3слово 4слово
5слово.
1) два слова
2) два слова
3) два слова | |
|
|
|
|
|
|
|
для: sasha12342
(12.02.2013 в 13:41)
| | Т.е. в приведенном примере после каждого "5слово" идет перебод строки.
И как по вашему программа должна узнать, где переносы строк не нужны, т.е. человек их навтыкал не понятно зачем, а где переносы нужны, т.е. начался список? Это изначально мало отношения к РВ имело, а в такой формулировке - блише к ИР. Для реализации этого вам придется описать все возможные варианты списков, учесть всевозможные опечатки, учесть что чел может и наоборот в списке забыть поставить перенос строки, ну и потом уже отформатировать. | |
|
|
|
|
|
|
|
для: Sfinks
(12.02.2013 в 14:46)
| | К примеру, возьмем сайт AVITO
Когда клиент дает объявление, то он может ввести какой угодно текст, с разными списками и разными всякими извращениями. А пользователям он показывается точно таким каким его вбил клиент но с одним исключением: Если текст выходит за рамки то он переносится на следующею строку и продолжается вывод в том виде в котором его ввел клиент.
Здесь можно посмотреть как это выглядит:
http://www.avito.ru/moskva/detskaya_odezhda_i_obuv/vesna_v_kerrine_lenne_mumin_ajspik_dzhonatan_96531045 | |
|
|
|
|
|
|
|
для: sasha12342
(12.02.2013 в 17:11)
| | Ваши слова сейчас:
> А пользователям он показывается точно таким каким его вбил клиент но с одним исключением
Противоречат вашим словам в 13:41:
Текст должен выглядеть так:
> 1слово 2слово 3слово 4слово
> 5слово. 1слово 2слово 3слово
> 4сово 5слово. 1слово 2слово
> 3слово 4слово 5слово.
> 1) два слова
> ...
> А выглядит так:
> 1слово 2слово 3слово 4слово
> 5слово.
> 1слово 2слово 3слово 4сово
> 5слово.
> 1слово 2слово 3слово 4слово
> 5слово.
А именно в том, что такой результат, как вы говорите, получается из текста:
> 1слово 2слово 3слово 4слово 5слово.
> 1слово 2слово 3слово 4сово 5слово.
> 1слово 2слово 3слово 4слово 5слово.
А такой, как вы хотите увидеть, из текста:
> 1слово 2слово 3слово 4слово 5слово. 1слово 2слово 3слово 4сово 5слово. 1слово 2слово 3слово 4слово 5слово.
Разницу чувствуете? Чтобы из первого варианта текста получить первый вариант форматирования, из исходного текста скрипт каким-то образом должен еще удалить переносы строк. А это противоречит вашему же утверждению, с которого я начал этот пост.
Если же в мое решение вставить второй вариант текста (одной строкой без переносов), то получите именно то форматирование, которое вы называете правильным. | |
|
|
|
|
|
|
|
для: Sfinks
(12.02.2013 в 23:31)
| | На словах легче объяснить чем в письменном виде.
смотрите:
в форму (шириной в 400пикс.) пользователь вводит текст такого вида:
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13. 14 - 15 - 16 -
17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27. 28 - 29 - 30
- 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40. 41 - 42 - 43 -
44 - 45 - 46 - 47 - 48 - 49 - 50
1) мягкий диван
2) удобное кресло
3) крепкий шкаф
мебель мебель мебель мебель
мебель мебель мебель
мебель мебель мебель мебель
| весь текст ввел без переноса строки.
Когда я вывожу этот-же текст в другую форму (шириной в 300пикс.) то получается так:
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 -
13. 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 22
- 23 - 24 - 25 - 26 - 27. 28 - 29 - 30 - 31 -
32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40. 41 -
42 - 43 - 44 - 45 - 46 - 47 - 48 - 49 - 50
1) мягкий диван
2) удобное кресло
3) крепкий шкаф
мебель мебель
мебель мебель
мебель
мебель мебель
мебель мебель
мебель мебель
|
Когда вывожу в <div> и <pre> шириной в 400пикс. получается так:
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13. 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27. 28 - 29 - 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40. 41 - 42 - 43 - 44 - 45 - 46 - 47 - 48 - 49 - 50
1) мягкий диван
2) удобное кресло
3) крепкий шкаф
мебель мебель мебель мебель мебель мебель мебель мебель мебель мебель мебель
|
Когда вывожу в <div> без <pre> шириной в 400пикс. получается так:
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13. 14 - 15 - 16 -
17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27. 28 - 29 - 30
- 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40. 41 - 42 - 43 -
44 - 45 - 46 - 47 - 48 - 49 - 50 1) мягкий диван 2) удобное
кресло 3) крепкий шкаф мебель мебель мебель мебель
мебель мебель мебель мебель мебель мебель мебель
|
Как мне вывести текст в контейнер <div> или <span> в таком виде в котором он выводиться в форме (шириной в 300пикс.)?
Если поместить все строки в <p></p> то список будет выглядеть некрасиво (не таким ка его ввел пользователь).
Почему у форм есть такая опция как "автоматический перенос строки при её достижение границы формы" а у дивов нет? | |
|
|
|
|
|
|
|
для: sasha12342
(13.02.2013 в 21:26)
| | > Если поместить все строки в <p></p> то список будет выглядеть некрасиво (не таким ка его ввел пользователь).
А в чем "некрасивость" заключается? Что-то вы путаете. Вы попробовали, или вам так кажется? Можно со скриншотом? Будет именно то, о чем вы говорите.
Ну или, как Вам уже написал Igorek, функцией nl2br():
echo '<div style="width:400px">'.nl2br($s).'</div>';
|
| |
|
|
|
|
 87 Кб |
|
|
для: Sfinks
(13.02.2013 в 22:24)
| | Вот скриншоты:
1) Это поле ввода, первые три предложения и последняя "абра-кадабра" вводилось бес переноса строки. (ширина поля 480 пикс.)
2) вывод данных в контейнер див (ширина 605 пикс.) с использованием "$s = '<p>'.str_replace("\n",'</p><p>',$s).'</p>';"
3) вывод данных в контейнер див (ширина 605 пикс.) с использованием "nl2br($s)" | |
|
|
|
|
 108.6 Кб |
|
|
для: sasha12342
(14.02.2013 в 13:52)
| | 2 | |
|
|
|
|
 104.6 Кб |
|
|
для: sasha12342
(14.02.2013 в 13:53)
| | 3
Как видите, нигде не получается вывести запись в том виде в котором ее ввёл пользователь | |
|
|
|
|
|
|
|
для: sasha12342
(14.02.2013 в 13:52)
| | Где-то подвох.
Откуда взялись переносы строк после "alpha - угол," или "p - полупериметр"? их быть не должно.
Покажите код что ли...
А если вас смущает, что пропали пробелы между словами "круг", то это вопросы к HTML и решать эту проблему нужно другим способом. | |
|
|
|
|
 101.5 Кб |
|
|
для: Igorek
(14.02.2013 в 15:51)
| | Прошу прошение! Не убрал одну регулярку.
echo nl2br($s); выдает: (см. скрин 4)
Вроде все так как хотел за исключением "пробелов", подскажите в каком направление двигаться.
Спасибо за помощь! | |
|
|
|
|
|
|
|
для: sasha12342
(14.02.2013 в 16:13)
| | можно использовать спец теги (например, как здесь [ code ][ /code ]), чтобы пользователь мог явно указать, что текст, заключенный в эти теги, необходимо обрабатывать особо - обрамить тегами <pre>, поменять пробелы на , свой вариант... | |
|
|
|
|
 105.1 Кб |
|
|
для: Igorek
(14.02.2013 в 19:06)
| | Спасибо за "наводку"
Если менять один пробел на то не срабатывает nl2br($text)
А если меняем два на два:
$text=str_replace(" "," ",$text);
echo nl2br($text);
|
То все получается так как надо (см. скрин5)!
Еще раз спасибо всем! | |
|
|
|
|
|
|
|
для: sasha12342
(12.02.2013 в 17:11)
| | А по приведенной ссылке вообще рядом нет ничего похожего, на жесткое форматирование и расстановку переводов строк <br>. Там просто каждый абзац завернут в <p></p>. Это можно сделать просто:
<?php
$s = '<p>'.str_replace("\n",'</p><p>',$s).'</p>';
|
| |
|
|
|
|
|
|
|
для: sasha12342
(11.02.2013 в 19:45)
| | вот готовая функция из фреймворка kohana http://kohanaframework.org/3.2/guide/api/Text#auto_p
хотя наверное вам хватит и http://php.net/nl2br
если я правильно понял задачу | |
|
|
|