Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: >br> после 80-го знака в одной строки
 
 автор: sasha12342   (11.02.2013 в 19:45)   письмо автору
 
 

Здравствуйте!
Не могу найти решение этой задачи:
На странице есть форма с полем "textarea" с шириной в 300 пикселей.
Пользователь вводит текст (скажем: три предложение на 300 символов; небольшой список из трёх строчек с нумерацией; одно предложение на 70 символов) при этом он первые три предложения пишет без переноса строки, то есть в поле "textarea" если текст дошёл до стенки поля, то он автоматический переноситься на следующую строку. Но когда дела доходит до списка, то пользователь уже самостоятельно переносит следующий пункт списка на следующею строку.
И вся эта информация заносится в БД.

А проблемы появляются при выводе этих данных на экран.

Если вытащить их в контейнер див шириной в 300 пикселей, то текст получится однообразным (без списка) зато в рамках контейнера.
Если поместить его в тэг <pre> то первые три предложения которые пользователь написал в один ряд, выйдут за пределы дива и экрана.
Если вывести через такую регулярку: $newtext = wordwrap($text, 80, "<br/>"); то может случится так, что второй пункт списка будет разбит на две строки хотя там всего два слова.

Как решаются такие задачи?
Как вытащить текст чтобы он не выходил за рамки контейнера див при этом сохранил список в том виде в котором его ввел пользователь.

  Ответить  
 
 автор: cheops   (11.02.2013 в 20:53)   письмо автору
 
   для: sasha12342   (11.02.2013 в 19:45)
 

Возможно вас заинтересует функция wordwrap().

  Ответить  
 
 автор: sasha12342   (11.02.2013 в 23:11)   письмо автору
 
   для: cheops   (11.02.2013 в 20:53)
 

Если вытащить их в контейнер див шириной в 300 пикселей, то текст получится однообразным (без списка) зато в рамках контейнера.
Если поместить его в тэг <pre> то первые три предложения которые пользователь написал в один ряд, выйдут за пределы дива и экрана.
Если вывести через такую регулярку: $newtext = wordwrap($text, 80, "<br/>"); то может случится так, что второй пункт списка будет разбит на две строки хотя там всего два слова.

  Ответить  
 
 автор: Sfinks   (12.02.2013 в 11:25)   письмо автору
 
   для: 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>";

?>

  Ответить  
 
 автор: sasha12342   (12.02.2013 в 13:41)   письмо автору
 
   для: 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) два слова

  Ответить  
 
 автор: Sfinks   (12.02.2013 в 14:46)   письмо автору
 
   для: sasha12342   (12.02.2013 в 13:41)
 

Т.е. в приведенном примере после каждого "5слово" идет перебод строки.

И как по вашему программа должна узнать, где переносы строк не нужны, т.е. человек их навтыкал не понятно зачем, а где переносы нужны, т.е. начался список? Это изначально мало отношения к РВ имело, а в такой формулировке - блише к ИР. Для реализации этого вам придется описать все возможные варианты списков, учесть всевозможные опечатки, учесть что чел может и наоборот в списке забыть поставить перенос строки, ну и потом уже отформатировать.

  Ответить  
 
 автор: sasha12342   (12.02.2013 в 17:11)   письмо автору
 
   для: Sfinks   (12.02.2013 в 14:46)
 

К примеру, возьмем сайт AVITO
Когда клиент дает объявление, то он может ввести какой угодно текст, с разными списками и разными всякими извращениями. А пользователям он показывается точно таким каким его вбил клиент но с одним исключением: Если текст выходит за рамки то он переносится на следующею строку и продолжается вывод в том виде в котором его ввел клиент.
Здесь можно посмотреть как это выглядит:
http://www.avito.ru/moskva/detskaya_odezhda_i_obuv/vesna_v_kerrine_lenne_mumin_ajspik_dzhonatan_96531045

  Ответить  
 
 автор: Sfinks   (12.02.2013 в 23:31)   письмо автору
 
   для: 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слово.

Разницу чувствуете? Чтобы из первого варианта текста получить первый вариант форматирования, из исходного текста скрипт каким-то образом должен еще удалить переносы строк. А это противоречит вашему же утверждению, с которого я начал этот пост.

Если же в мое решение вставить второй вариант текста (одной строкой без переносов), то получите именно то форматирование, которое вы называете правильным.

  Ответить  
 
 автор: sasha12342   (13.02.2013 в 21:26)   письмо автору
 
   для: 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> то список будет выглядеть некрасиво (не таким ка его ввел пользователь).

Почему у форм есть такая опция как "автоматический перенос строки при её достижение границы формы" а у дивов нет?

  Ответить  
 
 автор: Sfinks   (13.02.2013 в 22:24)   письмо автору
 
   для: sasha12342   (13.02.2013 в 21:26)
 

> Если поместить все строки в <p></p> то список будет выглядеть некрасиво (не таким ка его ввел пользователь).
А в чем "некрасивость" заключается? Что-то вы путаете. Вы попробовали, или вам так кажется? Можно со скриншотом? Будет именно то, о чем вы говорите.

Ну или, как Вам уже написал Igorek, функцией nl2br():
echo '<div style="width:400px">'.nl2br($s).'</div>';

  Ответить  
 
 автор: sasha12342   (14.02.2013 в 13:52)   письмо автору
87 Кб
 
   для: Sfinks   (13.02.2013 в 22:24)
 

Вот скриншоты:
1) Это поле ввода, первые три предложения и последняя "абра-кадабра" вводилось бес переноса строки. (ширина поля 480 пикс.)
2) вывод данных в контейнер див (ширина 605 пикс.) с использованием "$s = '<p>'.str_replace("\n",'</p><p>',$s).'</p>';"
3) вывод данных в контейнер див (ширина 605 пикс.) с использованием "nl2br($s)"

  Ответить  
 
 автор: sasha12342   (14.02.2013 в 13:53)   письмо автору
108.6 Кб
 
   для: sasha12342   (14.02.2013 в 13:52)
 

2

  Ответить  
 
 автор: sasha12342   (14.02.2013 в 13:53)   письмо автору
104.6 Кб
 
   для: sasha12342   (14.02.2013 в 13:53)
 

3

Как видите, нигде не получается вывести запись в том виде в котором ее ввёл пользователь

  Ответить  
 
 автор: Igorek   (14.02.2013 в 15:51)   письмо автору
 
   для: sasha12342   (14.02.2013 в 13:52)
 

Где-то подвох.
Откуда взялись переносы строк после "alpha - угол," или "p - полупериметр"? их быть не должно.
Покажите код что ли...
А если вас смущает, что пропали пробелы между словами "круг", то это вопросы к HTML и решать эту проблему нужно другим способом.

  Ответить  
 
 автор: sasha12342   (14.02.2013 в 16:13)   письмо автору
101.5 Кб
 
   для: Igorek   (14.02.2013 в 15:51)
 

Прошу прошение! Не убрал одну регулярку.
echo nl2br($s); выдает: (см. скрин 4)
Вроде все так как хотел за исключением "пробелов", подскажите в каком направление двигаться.
Спасибо за помощь!

  Ответить  
 
 автор: Igorek   (14.02.2013 в 19:06)   письмо автору
 
   для: sasha12342   (14.02.2013 в 16:13)
 

можно использовать спец теги (например, как здесь [ code ][ /code ]), чтобы пользователь мог явно указать, что текст, заключенный в эти теги, необходимо обрабатывать особо - обрамить тегами <pre>, поменять пробелы на &nbsp;, свой вариант...

  Ответить  
 
 автор: sasha12342   (15.02.2013 в 00:34)   письмо автору
105.1 Кб
 
   для: Igorek   (14.02.2013 в 19:06)
 

Спасибо за "наводку"
Если менять один пробел на &nbsp; то не срабатывает nl2br($text)
А если меняем два на два:
$text=str_replace("  ","&nbsp;&nbsp;",$text);
 echo nl2br($text);

То все получается так как надо (см. скрин5)!
Еще раз спасибо всем!

  Ответить  
 
 автор: Sfinks   (12.02.2013 в 23:44)   письмо автору
 
   для: sasha12342   (12.02.2013 в 17:11)
 

А по приведенной ссылке вообще рядом нет ничего похожего, на жесткое форматирование и расстановку переводов строк <br>. Там просто каждый абзац завернут в <p></p>. Это можно сделать просто:
<?php
  $s 
'<p>'.str_replace("\n",'</p><p>',$s).'</p>';

  Ответить  
 
 автор: Igorek   (12.02.2013 в 20:44)   письмо автору
 
   для: sasha12342   (11.02.2013 в 19:45)
 

вот готовая функция из фреймворка kohana http://kohanaframework.org/3.2/guide/api/Text#auto_p
хотя наверное вам хватит и http://php.net/nl2br

если я правильно понял задачу

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования