Разделитель больших строк

Opik

Новичок
Разделитель больших строк

Есть функция:

PHP:
    function myWrap($text, $limit, $char = ' ')
    {
       $a = explode($char, $text);
       foreach($a as $word)
       {
            $new[] = wordwrap($word, $limit, $char, 1);
       }
       return implode($char, $new);
   }
которая разделяет большую строку, на части.
например:
PHP:
 $about = myWrap($about, 5, ' ');
но есть 1 загвостка - если в это части встречаются теги HTML, то функция режет и это не есть хорошо.
добавить перед разделением проверку регуляркой на хтмл теги? или есть какое нить другое оптимальное решение?
 

[Gisma]

Новичок
так а что нельзя получить текст без хмтл-тегов?
/>([^<]+)</i думаю такое регулярное выражение подойдет
 

Opik

Новичок
Хорошо, получу текст без ХТМЛ, разрежу, и как правильно совместитть?
 

Steamroller

Новичок
но есть 1 загвостка - если в это части встречаются теги HTML, то функция режет и это не есть хорошо.
добавить перед разделением проверку регуляркой на хтмл теги? или есть какое нить другое оптимальное решение?
Можно ничего не делать. В том что кусок тега перенесен на другую строку по идее ничего плохого нету.
Еще можно в два прохода сделать - сначала разбить не глядя на теги, затем по всем строчкам пройтись и если строка начинается с куска тега (/^[^<>]+>/) - то перенести этот кусок в предыдущую строку.
 

Opik

Новичок
Можно ничего не делать. В том что кусок тега перенесен на другую строку по идее ничего плохого нету.
Оказывается есть. пример:
тег <br /> делится на <b r/>, и что в итоге - оснальная часть страницы - жирная.
 

Steamroller

Новичок
Это почему он так делится? В нем же не должно быть пробела между b и r.
 

Opik

Новичок
$about = 'aaa<br />ddddddddd';
$about = myWrap($about, 5, ' ');

что будет в итоге?
цифру специально уменьшил.
 

Steamroller

Новичок
Да, действительно.
Тогда не понятна задача решаемая.
Если просто разбить большие строки на маленькие - то что мешает wordwrap с последним параметром 0 вызывать?
 

Opik

Новичок
Если последний параметр = 0, то эффект не тот, он "врапит" только 1 раз
 

Steamroller

Новичок
А, кажется понял что ты хочешь.
Надо наверно вот эту функцию, которая слова разбивает, вызывать для кусков текста между тегами (/>([^<]+)</), с помощью preg_replace_callback.
 

Andreika

"PHP for nubies" reader
Opik
тебе надо разбить выводимый на экран текст на части или устроит и разбиение HTMLя
во втором случае в
---------------------
12345678901
<span id=1>1
</span>22 33
---------------------
на экран во второй строке вместо 11 символов выведется только 1
 

SelenIT

IT-лунатик :)
Вариант для частного случая - разбиение видимого текста пробелами:
PHP:
preg_replace('~([^<>\s](<[^>]+>)*){'.$limit.'}(?![^<]*>)~s', '\0 ', $text);
P.S. В регулярке пробелы, конечно, не нужны)
 

Opik

Новичок
SelenIT
Всё бы хорошо, но он разделяет только через первый $limit символов... а потом опять сплошной текст

-~{}~ 13.11.05 03:14:

А, это вообще не работает, пробелы убирал
 

SelenIT

IT-лунатик :)
Opik
Можно пример данных, на которых такое происходит, либо ссылку на него? Символы <> помимо тегов не используются?

На всяк. случай: пробел в замене (после \0) убирать не надо)
 

Opik

Новичок
PHP:
$about = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
 // $about = 'aaa<br />aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';

   $limit = 50;
   print preg_replace('~([^<>\s](<[^>]+>)*?){'.$limit.'}(?![^<]*?>?)~s', '\0 ', $about);
-~{}~ 13.11.05 12:41:

кстати, это нужно, что бы вот таких разъездов страницы не было.
 

SelenIT

IT-лунатик :)
C исходным вариантом регулярки
'~([^<>\s](<[^>]+>)*){'.$limit.'}(?![^<]*>)~s'
разбивает. А тут в последней lookahead assertion появились лишние знаки вопроса, фактически отменяющие всю проверку...
Эх, опять при сохранении возникли пробелы... ну что с ними делать?
 

Opik

Новичок
SelenIT
Да, заработало :) спасибо :)
да, регулярки это лес... надо пойти с топориком :)))
 

SelenIT

IT-лунатик :)
Opik
На самом деле есть в моей регулярке недоработка - на тегах внутри тега она запинается. Например, на "закомментаренных" тегах при $limit<3. Но на практике, имхо, такие ситуации весьма маловероятны...
 

Opik

Новичок
Да. такого варианта быть не может, там единственный тег - <br />
оочень редко другие.
 
Сверху