06
Ноя
2012

Разбиение текста на абзацы

Всем привет.

Решение где-то на виду, но я его не вижу.

Суть вопроса: есть текст, несколько К символов. Обычный текст, с разделительными знаками, в общем статья. Нужно разбить этот текст на куски по 1000 символов и до следующей точки, то есть разбить статью на абзацы, но чтобы не было разрыва в средине предложения.

Как я начал делать: сначала разбил весь текст на предложения, потом в цикле думал сделать объединение этих предложений в блоки по 1к символов. Но вот застопорился на коде. Как правильно сделать нумерацию получившихся блоков?

$pred = explode('.', $str); /// разбиваю текст на предложение
$pz   = 0;
for ($i = 0; $i < count($pred); $i++) { /// по очереди считываю каждое предложение

    while ($pz < 1000) { /// проверяю длину блока, и выполняю цыкл до тех пор пока длина меньше 1000 символов
        $lench   = strlen($pred[$i]); //определяю длину предложения
        $pz      = $pz + $lench; /// добавляю это число к длине блока
        $abz[$l] = $abz[$l] . $pred[$i]; ///добавляю к блоку предложение
    }
}

Как правильно задать переменную $l ?

Может я не туда копаю, может кто знает способ попроще? Буду рад помощи. В итоге должны получится несколько блоков (массив строк) с длиной примерно 1000 символов, и они должны заканчиваться точкой.

P.S.: нашол готовый класс от Яндекса, который делает то- что мне нужно... но как его использовать... ума не приложу

<?php
abstract class Big_Text_Translate {
    /**
     * @var int - максимальное число символов для отправки переводчику
     */
    public static $symbolLimit = 1000;

    /**
     * @var string- символы, по которым текст делится на предложения
     */
    public static $sentensesDelimiter = '.';

    /**
     * @static
     * @param  $text - исходный текст для разбиения на предложения
     * @return array - массив предложений, еще не окончательный
     */
    protected static function toSentenses ($text) {
        $sentArray = explode(self::$sentensesDelimiter, $text);
        return $sentArray;
    }

    /**
     * Разделение текста на массив больших кусков
     * @param  string $text - большой текстовый фрагмент, требующий разделения на куски
     * @return  array - массив элементов, каждый из которых не превышает предельного числа символов
     */

    public static function toBigPieces ($text) {
        $sentArray = self::toSentenses($text);
        $i = 0;
        $bigPiecesArray[0] = '';
        for ($k = 0; $k < count($sentArray); $k++) {
            $bigPiecesArray[$i] .= $sentArray[$k].self::$sentensesDelimiter;
            if (strlen($bigPiecesArray[$i]) > self::$symbolLimit){
                $i++;
                $bigPiecesArray[$i] = '';
            }
        }

        return $bigPiecesArray;
    }

    /**
     * Склеивание текста
     * @param array $bigPiecesArray - массив переведенных кусков текста, в произвольном порядке,
     * но ключи должна соответствовать исходному тексту
     * @return string - "склеенный" текст
     */
    public static function fromBigPieces (array $bigPiecesArray) {

        ksort($bigPiecesArray);

        return implode($bigPiecesArray);
    }

}
?>

Источник: https://ru.stackoverflow.com/questions/160925/%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0-%D0%BD%D0%B0-%D0%B0%D0%B1%D0%B7%D0%B0%D1%86%D1%8B

Share

Тебе может это понравится...