vasketsov
Я вот такой вот скриптик (вернее часть PHP-класса) написал -- строки свыше 60 символов разбивает на части, но всё это с сохранением форматирования. Переносы по возможности делает по словам:
Код:
class page
{
//...
function _do_code_brs( $str )
{
* *// Суть *этого манёвра, что бы спецсимволы, заменённые на их коды
* *// (< на < *итп) опять стали односимвольными -- что б прально
* *// работал подсчёт символов в строке.
* *$tmp_chars = array( "\x05", "\x06", "\x07", *"\x08" *);
* *$codes * * = array( '<', '>', '&', '"');
* *for( $i = 0; $i < count( $codes ); ++$i )
* * * *$str = str_replace( $codes[$i], $tmp_chars[$i], $str );
* *while( preg_match( "/[^\n\x01]{61,}/", $str ) )
* * * *$str = preg_replace( "/([^\n\x01]{61,})/e",
* * * * * * * * * * * * * * '$this->_do_code_brs_(\'\\1\')', $str );
* *for( $i = 0; $i < count( $codes ); ++$i )
* * * *$str = str_replace( $tmp_chars[$i], $codes[$i], $str );
* *return str_replace( "\x01", '<img src="/trash/br.gif">', $str );
}
function _do_code_brs_( $str )
{
* *preg_match( '/^(.{0,60})(\S*)(.*)$/', $str, $f );
* *preg_match( '/ */', $str, $offset );
* *if( $f[2] != '' )
* *{
* * * *preg_match( '/\S*$/', $f[1], $last_word );
* * * *if( $last_word[0] != $f[1] )
* * * * * *return
* * * * * *substr( $f[1], 0, strlen( $f[1] ) - strlen( $last_word[0] ) )
* * * * * *. "\x01\n" . $offset[0] . $last_word[0] . $f[2] . $f[3];
* *}
* *preg_match( '/ */', $str, $offset );
* *return $f[1]."\x01\n".$offset[0].$f[2].$f[3];
* *echo '<pre>'; print_r( $f );
* *return substr( $str, 0, 60 );
}
// ...
};
Если кому-нибудь нуно могу дать вариант на perl'е. Работает как часы. Причём, гораздо лучше чем простое
Код:
$str =~ s/([^\n]{60})([^\n])/$1\n$2/;
Добавлено:
Но, вообще, я решил применять решение проще -- сделать шрифт для кода меньше, и весь код, который я собираюсь публиковать на страницы сразу (вручную) форматировать по ширине на 60 символов -- всё прекрасно смотрится даже в 640x480.