Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заменить пробелы на   - только вначале строк 
:(
    Опции темы
Wolf1994
Дата 7.2.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 1
Всего: 29



Допустим, есть текст:
Код

Текст...
    Заголовок1
        Подзаголовок1
    Заголовок2
        Подзаголовок2
...Текст


Можно ли средствами регулярок заменить все пробелы после "\n" на " "? Это нужно, чтобы соблюсти "красные строки", но сохранить автоперенос обычных строк браузером (по обычным пробелам).

Всё что у меня получилось:
Код

 $ex [$i]=preg_replace ("@<br />( )@si", "<br />&nbsp;", $ex [$i]);

- то есть все пробелы, в начале строк, заменяются на ОДИН "&nbsp;". Как сделать, чтобы количество "&nbsp;" совпадало с количеством пробелов? Ведь обычные функции нельзя встраивать в регулярное выражение, а без них сделать не получается...
PM MAIL WWW   Вверх
Akina
Дата 7.2.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Код

$str = str_repeat('&nbsp;',len($str)-len(ltrim($str))) . ltrim($str)
smile


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Mal Hack
Дата 7.2.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Лучше, все-таки красную строку делать через css и <p>
PM ICQ   Вверх
Wolf1994
Дата 7.2.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 1
Всего: 29



2Akina: насколько я понял, этот пример обрабатывает СТРОКУ, а как быть с текстом, в котором множество строк - как выполнить обработку для каждой строки?

2Mal Hack: А это возможно? Единственный вариант, который я нашёл:
<p style="white-space: nowrap">
- но, тогда строки перестанут переносится, мне же, надо выделить только начала строк smile
PM MAIL WWW   Вверх
smartov
Дата 8.2.2006, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



Wolf1994

1) Не совсем уловлю.
В тексте переносы <br>-ами а пробелы - просто символом пробела. Как так оказалось?

2) Может быть тег <pre> с описанным для него стилем (размер, цвет шрифта) поможет в этой ситуации?

3) На крайняк
Код

$ex[$i] = preg_replace('/(<br>)(\s+)/', "\${2}", $ex[$i]);


Это сообщение отредактировал(а) smartov - 8.2.2006, 01:04
PM MAIL   Вверх
Mal Hack
Дата 8.2.2006, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(Wolf1994 @ 7.2.2006, 23:55 Найти цитируемый пост)

2Mal Hack: А это возможно?

Ага. Свойство text-indent.

PM ICQ   Вверх
Wolf1994
Дата 8.2.2006, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 1
Всего: 29



Цитата(Mal Hack @ 8.2.2006, 01:52 Найти цитируемый пост)

Ага. Свойство text-indent.

Не подходит. Оно устанавливает фиксированный отступ. Того же самого эффекта можно достичь с &nbsp;.

Цитата(smartov @ 8.2.2006, 00:52 Найти цитируемый пост)

1) Не совсем уловлю.
В тексте переносы <br>-ами а пробелы - просто символом пробела. Как так оказалось?

Текст частично обработан на этой стадии - все символы "\n"/"\r\n" уже заменены на "<br />". Можно в примере взять "\n" - это сути вопроса не меняет.

Цитата(smartov @ 8.2.2006, 00:52 Найти цитируемый пост)

2) Может быть тег <pre> с описанным для него стилем (размер, цвет шрифта) поможет в этой ситуации?

Пробовал:
<p style="white-space: pre">
<p style="white-space: normal">
<p style="white-space: nowrap">

... Попробовал <pre> - не подходит. Он не только выделяет отступы, но также запрещает перенос строк, что сводит на "нет" всё автоформатирование (

Цитата(smartov @ 8.2.2006, 00:52 Найти цитируемый пост)

3) На крайняк

Без результата (

Единственный вариант, который меня не устраивает - это разбить текст на строки (по метке конца строки) эксплодом и применить к каждой отдельно взятой строке метод предложенный Akina. Но если сделать так, то насколько это снизит скорость обработки текста большого размера (200 Кб)? То есть такое решение разумно - для средней мощности хостинга? Хотелось бы как-нибудь пооптимальней... )
PM MAIL WWW   Вверх
AlexW
Дата 8.2.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.1.2006

Репутация: нет
Всего: 1



У меня фаил с более 100000 строк preg_replace очень долго обрабатывает, а str_replace справляеться за несколько секунд
PM MAIL   Вверх
Akina
Дата 8.2.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(Wolf1994 @ 8.2.2006, 00:55 Найти цитируемый пост)

этот пример обрабатывает СТРОКУ, а как быть с текстом, в котором множество строк - как выполнить обработку для каждой строки?

split, foreach, join
Добавлено @ 10:08
Цитата(Wolf1994 @ 8.2.2006, 04:45 Найти цитируемый пост)

насколько это снизит скорость обработки текста большого размера (200 Кб)?

test...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
smartov
Дата 8.2.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



Wolf1994
Цитата(Wolf1994 @ 8.2.2006, 02:45 Найти цитируемый пост)

Попробовал <pre> - не подходит. Он не только выделяет отступы, но также запрещает перенос строк, что сводит на "нет" всё автоформатирование (

Не запрещает он перенос строк. Просто переносы должны быть \n а не <br> чтобы <pre> их верно обрабатывал.

Цитата(Wolf1994 @ 8.2.2006, 02:45 Найти цитируемый пост)
Без результата (

Пардон. Забыл что тебе надо заменить на &nbsp;.

Код

$strA = split('<br>', $ex[$i]);
foreach ($strA as $i => $str)
    $strA[$i] = str_repeat('&nbsp;',strlen($str)-strlen(ltrim($str))).ltrim($str);
    
$ex[$i] = implode('<br>', $strA);

PM MAIL   Вверх
Mal Hack
Дата 8.2.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(Wolf1994 @ 8.2.2006, 03:45 Найти цитируемый пост)

Не подходит. Оно устанавливает фиксированный отступ. Того же самого эффекта можно достичь с &nbsp;.

А разве тебе этого не нужно?
Да, конечно, достигнешь ты этого эффекта, особенно с выравниванием текста по краям..
PM ICQ   Вверх
Wolf1994
Дата 8.2.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 1
Всего: 29



Цитата(smartov @ 8.2.2006, 12:26 Найти цитируемый пост)

Не запрещает он перенос строк. Просто переносы должны быть \n а не <br> чтобы <pre> их верно обрабатывал.

Дело в том, что текст не форматированный (это дело доверено браузеру - в зависимости от размера). Нужно, чтобы текст переносился не только по \n но и по пробелу - если длина строки превышает лимит таблицы.

Цитата

$strA = split('<br>', $ex[$i]);
foreach ($strA as $i => $str)
    $strA[$i] = str_repeat('&nbsp;',strlen($str)-strlen(ltrim($str))).ltrim($str);
   
$ex[$i] = implode('<br>', $strA);

Именно так я это и представлял. Спасибо (+).

Цитата(Akina @ 8.2.2006, 10:07 Найти цитируемый пост)

test...

Приступаю...
PM MAIL WWW   Вверх
Wolf1994
Дата 8.2.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: 1
Всего: 29



Цитата(Wolf1994 @ 8.2.2006, 17:58 Найти цитируемый пост)

Приступаю...

Test passed!!!

Всем спасибо!
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0805 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.