@montiorko

Деление статьи через n-слов и после ближайшего /p посредством {pagebreak}, как?

Здравствуйте, уважаемые. Есть код, который разбивает статью на страницы посредством {PAGEBREAK}. $config['page_break_news'] - n слов, по истечению которых вставляем {PAGEBREAK}. Есть нюанс: если слово заканчивается в фразе заключенной в <i>, <b> и т.д. нарушается синтаксис html. Т.е. на одной странице текст обрывается на открывающем теге и на следующую переносится закрывающий.

Сейчас:
<p>текст текст <i>текст текст{PAGEBREAK}текст текст</i> текст текст.</p>
<p>остальной текст...</p>


Правильно:
<p>текст текст <i>текст текст текст текст</i> текст текст.</p>{PAGEBREAK}
<p>остальной текст...</p>


Статья имеет абзацы заключенные в <p>. Вопрос, как сделать так, чтобы при достижении нужного количества слов, происходил поиск ближайшего закрывающегося </p> и за ним ставился разделитель {PAGEBREAK}?
if($config['page_break_news'] != 0) {
    $add = "{PAGEBREAK}"; 
    $every = $config['page_break_news'] ; 
    $words= explode(" ",$row['full_story']); 
    $l=1;
    $co = count($words);
    for ($i=0;$i<$co;$i++) {
      if($l==$every){
       $words[$i].=$add;
       $l=0;
      }
      $l++;
    }
    $row['full_story'] = implode(" ",$words);
}
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 1
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
Регулярка для поиска проблемных мест:
/<([a-z]+)>(?<!<p>).+(?!(?:<\/p>|<\/\1>))\{PAGEBREAK\}.+<\/\1>/


Выносит PAGEBREAK за тэг. Применять ее нужнок уже готовому тексту. Применять ко всему тексту не рекомендую, так как могут быть проблемы с производительностью. Лучше отдельно к каждому параграфу. Можно разбить по параграфам в массив и массив передавать в preg_replace:
preg_replace("/(?P<start><([a-z]+)>(?<!<p>).+(?!(?:<\/p>|<\/\2>)))\{PAGEBREAK\}(?P<end>.+<\/\2>)/", "\1 \3 {PAGEBREAK}", $input_lines);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы