php: разбить строку пополам в пустое пространство, пока ни одна из полученных частей не будет длиннее, чем число слов х - PullRequest
2 голосов
/ 14 октября 2011

Как бы я разбил предложение на половину, пока ни одна из полученных частей не будет длиннее, скажем, 8 слов?

Вот пример текста из 39 слов:

«Это длинная строка, которая может отличаться, поскольку это функция черного ящика, и я не знаю, какие строки я получу, но мне нужно быть намного короче наверняка».

Результирующий вывод

This is a long string that can be
different since this is a black box
function and I do not know what strings
I am going to receive, but I
need to be shorter for sure by a
lot

Любые советы, пожалуйста?

Ответы [ 4 ]

5 голосов
/ 14 октября 2011

Я бы пошел с wordwrap(). Строки вашего примера имеют длину около 35 символов. Вот тот, который идет к 40.

echo wordwrap($long_string, 40);

Печать:

This is a long string that can be
different since this is a black box
function and I do not know what strings
I am going to receive, but I need to be
shorter for sure by a lot.

Укажите третий параметр для wordwrap(), если разрывы строк \r\n, а не по умолчанию \n.

3 голосов
/ 14 октября 2011

Попробуйте это

<?php
$text = "This is a long string that can be different since this is a black box function and I do not know what strings I am going to receive, but I need to be shorter for sure by a lot.";
$newtext = wordwrap($text, 40, "\n", true); // assign number as per you requirement

echo "$newtext\n";
?>
2 голосов
/ 14 октября 2011

Принимая ваш вопрос буквально

Как бы я разделил предложение на две части, пока ни одна из полученных частей не будет длиннее, скажем, 8 слов?

, более конкретно

повторяющееся деление пополам, пока ни один кусок не будет длиннее 8.

на счет:

$sentence = "This is a long string that can be different since this is a black box function and I do not know what strings I am going to receive, but I need to be shorter for sure by a lot.";

$say8words = 8;

# start with one piece, use preg_split for finer control.
$pieces[] = explode(' ', $sentence); 

while(is_a_piece_longer_than($pieces, $say8words))
    $pieces = splitting_in_half($pieces);

echo as_string($pieces);

Что даст вам:

This is a long string that
can be different since this
is a black box function
and I do not
know what strings I am going
to receive, but I
need to be shorter for
sure by a lot.

и может быть не тем, о чем вы на самом деле думали, что просили.

Функции:

function is_a_piece_longer_than($pieces, $length)
{
    return $length < max(array_map('count', $pieces));
}

function splitting_in_half($pieces)
{
    $halfs = array();
    foreach($pieces as $full)
    {
        $count = count($full);
        $halfCount = 1 + (int) ($count / 2);
        foreach(array_chunk($full, $halfCount) as $half)
            $halfs[] = $half;
    }
    return $halfs;
}

function as_string($pieces)
{
    return array_reduce($pieces, function($v, $w) { return $v . (strlen($v) ? "\n" : '') . implode(' ', $w);}, '');
}
1 голос
/ 14 октября 2011

Используйте str_split().Проверьте документацию на php.net

...