X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Помогите составить алгоритм "переноса" длинных слов
Alexander
сообщение 2010-10-26, 3:10
Сообщение #1
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

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


Встала проблема оптимизации системы. При разборе и фильтрации входящего от пользователя HTML около 80% затраченных ресурсов приходится на проставление переносов в длинные слова. Расстановка переносов нужна пержде всего для того, чтобы в случае бесконечнодлинной непрерывной последовательности символов, дизайна сайта не "поехал".

На сегодня алгоритм выглядит так:
$text='Тут текст';

$brlen=50;
$len=mb_strlen($text);
$chars_cnt=$cur_pos=0;
$no_br=array('textarea');#,'script'
$br=array('br');
$br_len=mb_strlen('­');
while($cur_pos<$len)
{
	if(preg_match('#^<([a-z0-9]+)[^>]*>#',mb_substr($text,$cur_pos),$m)>0)
	{
		if(in_array($m[1],$no_br))
		{
			$chars_cnt=0;
			$cur_pos=strpos($text,'</'.$m[1].'>',$cur_pos)+mb_strlen($m[1])+3;
		}
		else
		{
			if(in_array($m[1],$br))
				$chars_cnt=0;
			$cur_pos+=mb_strlen($m[0]);
		}
		continue;
	}
	if(preg_match("#^(\t|\r|\n|\s|&nbsp;|\-|&shy;)+#",mb_substr($text,$cur_pos),$m)>0)
	{
		$chars_cnt=0;
		$cur_pos+=mb_strlen($m[0]);
		continue;
	}
	if(preg_match("/^&[#a-z0-9]{1,10};/",mb_substr($text,$cur_pos),$m)>0)
		$cur_pos+=mb_strlen($m[0]);
	if(++$chars_cnt>=$brlen)
	{
		$text=substr_replace($text,'&shy;',mb_strwidth(mb_substr($text,0,$cur_pos)),0);
		$chars_cnt=0;
		$cur_pos+=$br_len;
		$len+=$br_len;
	}
	++$cur_pos;
}


Как видно, очень ресурсоемко. К сожалению я не смог придумать ничего лучше :( Прошу помочь. Однако, следует учитывать следующие особенности задачи:
1. Переносить слова нужно именно при помощи спецсимвола &shy - поскольку для пользователей с разными размерами мониторов, строки должны переносится по-разному.
2. Замена регуляркой типа [a-z0-9]{50} - невозможна. Поскольку последовательность 111111111<a href="3">1111111111</a>111111 также непрерывна.
3. Пункт 2 невозможен еще и по той причине, что если встречается спецсивол типа &quot , его нельзя разрывать т.е. нельзя вставить &shy вовнутрь &quot.
4. Внутри тега textarea такая замена длинных строк не нужна.
Перейти в начало страницы
+Цитировать сообщение
Djadka
сообщение 2010-10-26, 20:50
Сообщение #2
Любитель
Иконка группы

Группа: Eleanor user
Сообщений: 463
Регистрация: 2010-10-17

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


Александр, может такой вариант было проще реализовать на джаве?!
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2010-10-26, 22:26
Сообщение #3
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

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


Ну предложите решение на java... Даже не знаю...
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2010-10-26, 23:34
Сообщение #4
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

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


Появился интересный вариант с css - word-wrap:break-word http://htmlbook.ru/css/word-wrap
Кто сможет потестировать на кроссбраузерность?
Перейти в начало страницы
+Цитировать сообщение
termit
сообщение 2010-10-27, 0:03
Сообщение #5
Опытный
Иконка группы

Группа: Бета-тестеры
Сообщений: 705
Регистрация: 2009-06-02
Из: Житомир

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


По описанию, опера не поддерживает... обидно, если будет, время, лично проверю...
На опере 10 работает, если не указывать размер блока, то он по дефолту под розрешение монитора..
В качестве переноса используется символ ">"

Сообщение отредактировал termit - 2010-10-27, 0:08
Перейти в начало страницы
+Цитировать сообщение
Гость_viachet_*
сообщение 2014-08-14, 18:18
Сообщение #6



Гости





Правильнее будет нагрузить этой задачей браузер пользователя, и текст в этом случае с сервера в первозданном виде приходить будет
Самый верный способ пока - это использовать для этих целей javascript. CSS правила работают не везде.
Есть крохотный jquery плагин на 20 строчек , который добавляет в уже готовый текст на стороне клиента, в браузере "возможные переносы" в текст
Перейти в начало страницы
+Цитировать сообщение

Ответить в данную темуНачать новую тему
0 чел. читают эту тему (гостей: 0, скрытых пользователей: 0)
Пользователей: 0

 
RSS Текстовая версия 0.0345 сек.    12 запросов    GZIP включен    Сейчас: 2024-03-28, 23:58