CMS Eleanor - Поиск
Полная версия этой страницы: Официальный форум Eleanor CMS » Помогите составить алгоритм "переноса" длинных слов
Официальный форум Eleanor CMS » Для вебмастеров и владельцев сайтов » Комната программистов
Alexander
Встала проблема оптимизации системы. При разборе и фильтрации входящего от пользователя 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
Александр, может такой вариант было проще реализовать на джаве?!
Alexander
Ну предложите решение на java... Даже не знаю...
Alexander
Появился интересный вариант с css - word-wrap:break-word http://htmlbook.ru/css/word-wrap
Кто сможет потестировать на кроссбраузерность?
termit
По описанию, опера не поддерживает... обидно, если будет, время, лично проверю...
На опере 10 работает, если не указывать размер блока, то он по дефолту под розрешение монитора..
В качестве переноса используется символ ">"
Правильнее будет нагрузить этой задачей браузер пользователя, и текст в этом случае с сервера в первозданном виде приходить будет
Самый верный способ пока - это использовать для этих целей javascript. CSS правила работают не везде.
Есть крохотный jquery плагин на 20 строчек , который добавляет в уже готовый текст на стороне клиента, в браузере "возможные переносы" в текст
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.