@eddasphp

Как разделить текст на 5 частей php?

...
$seotext = $text;
...

есть файл с текстом- обозначен $text.
В файле где-то 7-9 тысяч слов.
Как разделить текст на 5 частей? В тексте есть точки. Надо чтобы каждый новый абзац начинался после точки.
И абзацы должны поместиться в
абзац 1
абзац 2
абзац 3
абзац 4
абзац 5
  • Вопрос задан
  • 1088 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Если нужно получить параграфы примерно одинакового размера:
$text = '...';

$textSize = mb_strlen($text);
$paragraphsCount = 5;
$averageParagpaphSize = ceil($textSize / $paragraphsCount);

$paragraphs = [];

for ($i = 0; $i < $paragraphsCount; $i++)
{
  $currentParagraph = mb_substr($text, $averageParagpaphSize * $i, $averageParagpaphSize);
  $paragraphs[] = $currentParagraph;
}

for ($i = 1; $i < $paragraphsCount; $i++)
{
  $currentParagraph = $paragraphs[$i - 1];
  $nextParagraph = $paragraphs[$i];

  if (mb_substr($currentParagraph, -1, 1) !== '.')
  {
    $dotPosition = mb_strpos($nextParagraph, '.') + 1;

    $currentParagraph .= mb_substr($nextParagraph, 0, $dotPosition);
    $nextParagraph = trim(mb_substr($nextParagraph, $dotPosition));
  }

  $paragraphs[$i - 1] = $currentParagraph;
  $paragraphs[$i] = $nextParagraph;
}

var_dump($paragraphs);

Тут не обработаны разные граничные случаи, но общий принцип ясен.
Запустить

Гораздо короче вариант, который предложил Михаил:
$text = '...';
$paragraphsCount = 5;

$sentences = mb_split('\.', $text);
$paragraphs = array_chunk($sentences, ceil(count($sentences) / $paragraphsCount));

array_walk($paragraphs, function (&$paragraphSentences) {
  $paragraphSentences = implode(' ', $paragraphSentences);
});

var_dump($paragraphs);

Запустить
Правда, здесь в параграфах получается одинаковое количество предложений, но по длине они отличаются сильнее.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
scherbuk
@scherbuk
explode => array_chunk => implode
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Ваш ответ на вопрос

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

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