wordwrap текста с html и спецсимволами

Qwerty

Новичок
wordwrap текста с html и спецсимволами

Вопрос по разрезанию длинных слов возникал, как я погляжу, на форуме много раз.
Звучит он так: Как в тексте, содержащем html-тэги, все слова, более длинные, чем $limit разрезать пробелами. Чтобы верстка не портилась.

Наиболее интересными темами мне показались эти:
1. Разделитель больших строк
2. Как правильно обрезать строку с HTML тегами. Есть ли готовые решения? (немного не по теме)

По ссылке (1) пришли к слеждующему решению:
PHP:
$text=preg_replace('~([^<>\s](<[^>]+>)*){'.$limit.'}(?![^<]*> )~s', '\0 ', $text);
Однако, оно не учитывает наличие в html-тексте спецсимволов вида &nbsp; $#8470; и т.п.
Думаю, было бы полезно добить регулярное выражение, чтобы оно корректно обрабатывало такие вещи. Сейчас оно их просто может резать в середине.
 

litvinenko

Новичок
http://phpfaq.ru/regexp
http://ru2.php.net/manual/ru/ref.pcre.php
и тестирование, тестирование и еще раз тестирование :)
 

Qwerty

Новичок
Ожидал такую реакцию... Думаете, это разумно - учиться (опять) регуляркам ради этого одного раза? Да они мне нужны раз в год, я успеваю выучить, написать что надо и благополучно забыть... :(
Конечно, я ковыряюсь с этим выражением, спасибо за ссылки, но у меня есть документация...
Хорошо, что не "фгугол".

Самим-то тема не интересна? Неужели никому другому это не нужно?
 

litvinenko

Новичок
мне как-то тоже регулярки "были не нужны". А потом пришел шеф и сказал, чтобы я за 2 минуты очень срочно написал рег. выражение. пришлось срочно лезть в мануал, доки и думать, как что написать.
Я хочу сказать о том, что если ты задался этой проблемой, то и реши ее до конца, а не просто выступи в роли генератора идей.
 

Qwerty

Новичок
Смысл форума тогда... :(
Почитав документацию, ее примеры и т.д. я не могу представить как написать такое выражение. Тут нужен опыт...
Я не против самостоятельно написать нужное выражение, просто даже подступиться не могу, документация здесь не поможет, тут нужно прочувствовать ЧТО применять... Ох уж эти регулярки. :(
Ок, мой ход мыслей:
- дорабатывать данное выражение, наверное, не получится;
- если получится, то нужно как-то указать, что не резать внутри таких кусочков: &([a-z]{2,10}|#[0-9]{4}); и добавлять их длину к $limit... но как такое сделать?

-~{}~ 27.09.07 17:49:

Второй рожей хотел такую :) поставить.
 

Qwerty

Новичок
Mr_Max
Да это-то понятно.
Просто есть люди, которые пытаются помочь
и есть люди, которые отправляют в гугол и правила форума.
Поверьте, правила форума я прекрасно помню (так же как и знаю о существовании поисковиков).

От тех же, кому интересна сия тема хотелось бы услышать предложения, в каком примерно направлении посоветова ил бы двигаться.

-~{}~ 28.09.07 11:45:

Так... Эта тема на первом месте в Яндексе по запросу "wordwrap html спецсимволы". :) Надо срочно писать в нее ответ. :)
Т.к. сделать регуляркой у меня это даже близко не получается, написал это скриптом.
В первом приближении вот так:
PHP:
// Вырезаем и сохраняем спецсимволы
// Заменяем на &, которые в html по идее вне спецсимволов встречаться не могут, сам амперсанд пишется как & amp;
$spec=array();
$text2="";
while (strpos($text,"&")!==false) {
  $pos1=strpos($text,"&");
  $pos2=strpos($text,";",$pos1);
  if ($pos2===false) {
    $pos2=strlen($text)-1;
  }
  $text2.=substr($text,0,$pos1)."&";
  $spec[]=substr($text,$pos1+1,$pos2-$pos1-1);
  $text=substr($text,$pos2+1);
}
$text=$text2.$text;
//

$text=preg_replace('~([^<>\s](<[^>]+>)*){'.$wrap_num.'}(?![^<]*>)~s', '\0 ', $text);

// Восстанавливаем спецсимволы
$pos1=0;
for ($i=0;$i<count($spec);$i++) {
  $pos1=strpos($text,"&",$pos1);
  $text=substr_replace($text,"&".$spec[$i].";",$pos1,1);
  $pos1++;
}
//
Наверное, можно более коротко и красиво написать, поработаю еще над этим. Например, вырезать спецсимволы регуляркой, контролировать их длину, корректно обрабытывать одиночные амперсанды... Можно заменять на что-то более безобидное, явно не встречающееся в тесте, но являющееся не-space символом.

Жду комментариев.

P.S. Сейчас одиночные символы & (в т.ч. в гиперссылках) обрабатываются неверно.
 
Qwerty
Тебе так кажется. Стоит лишь мало-мальски освоиться с регулярными выражениями, и ты будешь находить каждый день все новые и новые изящные и изощренные применения, решать с их помощью задачи которые ранее решал другими путями. Это ж интересно :). Я и сам не отец, но немного разбираюсь, и вначале мне тоже было трудно, но подход тут такой же как и со всем прочим -- просто немного упорства, терпения и практики..
 

cDLEON

Онанист РНРСlub
Qwerty
Гыгы. Попробуй обработать своим кодом
Код:
блаблаблабла&блаблаблаблаблаблаблаблаблаблаблаблаблаблабблаблаблаблалаблаблаблаблаблаблаблаблаблаблаблаблаблаблаблабла;
-~{}~ 28.09.07 12:09:

Вообще...Как вариант, до резалки можно преобразовать все мнемоники в символы. Правда повысятся накладные расходы 8)
---
А на счёт регулярки ты зря...
 

Qwerty

Новичок
Я написал про это... Предполагается, это на входе html, в котором нет символов & прото так. Согласен, что надо бы доработать.
 

fixxxer

К.О.
Партнер клуба
cDLEON, строго говоря, у тебя невалидный HTML - там по хорошему должно быть
Код:
...бла&amp;amp;бла..
а задача обработки невалидного хтмл в общем случае нерешаема - проще прогонять предварительно каким-нибудь tidy.
 
Сверху