Разделить строки пополам (Word-Aware) с помощью PHP

Я пытаюсь разделить строки пополам, и он не должен разбиваться посередине слова.

До сих пор я придумал следующее: 99% работает:

$text = "The Quick : Brown Fox Jumped Over The Lazy / Dog";
$half = (int)ceil(count($words = str_word_count($text, 1)) / 2); 
$string1 = implode(' ', array_slice($words, 0, $half));
$string2 = implode(' ', array_slice($words, $half));

Это работает, правильно разбивая любую строку пополам в соответствии с количеством слов в строке. Тем не менее, он удаляет любые символы в строке, например, для вышеприведенного примера:

The Quick Brown Fox Jumped
Over The Lazy Dog

Мне нужно сохранить все символы как: и/в строке после разделения. Я не понимаю, почему текущий код удаляет символы... Если вы можете предоставить альтернативный метод или исправить этот метод, чтобы не удалять символы, было бы весьма полезно:)

Ответ 1

Посмотрев на ваш пример вывода, я заметил, что все наши примеры отключены, мы даем меньше string1, если середина строки находится внутри слова, а затем дает больше.

Например, середина The Quick : Brown Fox Jumped Over The Lazy / Dog равна The Quick : Brown Fox Ju, которая находится посередине слова, этот первый пример дает string2 слово split; нижний пример дает string1 слово split.

Дайте меньше string1 на словом word

$text = "The Quick : Brown Fox Jumped Over The Lazy / Dog";

$middle = strrpos(substr($text, 0, floor(strlen($text) / 2)), ' ') + 1;

$string1 = substr($text, 0, $middle);  // "The Quick : Brown Fox "
$string2 = substr($text, $middle);  // "Jumped Over The Lazy / Dog"

Дайте больше string1 на словом word

$text = "The Quick : Brown Fox Jumped Over The Lazy / Dog";

$splitstring1 = substr($text, 0, floor(strlen($text) / 2));
$splitstring2 = substr($text, floor(strlen($text) / 2));

if (substr($splitstring1, 0, -1) != ' ' AND substr($splitstring2, 0, 1) != ' ')
{
    $middle = strlen($splitstring1) + strpos($splitstring2, ' ') + 1;
}
else
{
    $middle = strrpos(substr($text, 0, floor(strlen($text) / 2)), ' ') + 1;    
}

$string1 = substr($text, 0, $middle);  // "The Quick : Brown Fox Jumped "
$string2 = substr($text, $middle);  // "Over The Lazy / Dog"

Ответ 2

function split_half($string, $center = 0.4) {
        $length2 = strlen($string) * $center;
        $tmp = explode(' ', $string);
        $index = 0; 
        $result = Array('', '');
        foreach($tmp as $word) {
            if(!$index && strlen($result[0]) > $length2) $index++;
            $result[$index] .= $word.' ';
        }
        return $result;
}

Демо: http://codepad.viper-7.com/I58gcI

Ответ 3

Просто измените строку:

$half = (int)ceil(count($words = (count(explode(" ",$text))) / 2);

str_word_count() может не считаться: или/как слово.

Ответ 4

function split_half($string){
$result= array();
$text = explode(' ', $string);
$count = count($text);
$string1 = '';
$string2 = '';
if($count > 1){
    if($count % 2 == 0){
        $start = $count/2;
        $end = $count;
        for($i=0; $i<$start;$i++){
            $string1 .= $text[$i]." ";
        }
        for($j=$start; $j<$end;$j++){
            $string2 .= $text[$j]." ";
        }           
    $result[] = $string1;
    $result[] = $string2;
    }
    else{
        $start = round($count/2)-1;
        $end = $count;
        for($i=0; $i<$start;$i++){
            $string1 .= $text[$i]." ";
        }
        for($j=$start; $j<$end;$j++){
            $string2 .= $text[$j]." ";
        }           
    $result[] = $string1;
    $result[] = $string2;

    }
}
else{
    $result[] = $string;
}
return $result;
}

Используйте эту функцию для разделения строки на половину слова.

Ответ 5

Я был создан отличное решение, где мы не потеряли символов или где слово не вырезано неправильно.

function split_title_middle ( $title ) {
    $title = strip_tags( $title );
    $middle_length = floor( strlen( $title ) / 2 );
    $new_title = explode( '<br />', wordwrap( $title, $middle_length, '<br />') );
    if (isset( $new_title[2] ) ) {
        $new_title[1] .= ' ' . $new_title[2];
        unset( $new_title[2] );
    }

    return $new_title;
 }

// how to use
$title = split_title_middle( $title );
echo $title[0] . '<strong>' . $title[1] . '</strong>';

Ответ 6

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

По умолчанию он разбивает строку на первое вхождение пробела после середины. Если после середины нет пробелов, он ищет последний пробел перед серединой.

function trim_text($input) {
    $middle = ceil(strlen($input) / 2);
    $middle_space = strpos($input, " ", $middle - 1);

    if ($middle_space === false) {
        //there is no space later in the string, so get the last sapce before the middle
        $first_half = substr($input, 0, $middle);
        $middle_space = strpos($first_half, " ");
    }

    if ($middle_space === false) {
        //the whole string is one long word, split the text exactly in the middle
        $first_half = substr($input, 0, $middle);
        $second_half = substr($input, $middle);
    }
    else {
        $first_half = substr($input, 0, $middle_space);
        $second_half = substr($input, $middle_space);
    }
        return array(trim($first_half), trim($second_half));
}

Вот примеры:

Пример 1:

"WWWWWWWWWW WWWWWWWWWW WWWWWWWWWW WWWWWWWWWW"

Разделен как

"WWWWWWWWWW WWWWWWWWWW"

"WWWWWWWWWW WWWWWWWWWW"

Пример 2:

"WWWWWWWWWWWWWWWWWWWW WWWWWWWWWW WWWWWWWWWW"

Разделен как

"WWWWWWWWWWWWWWWWWWWW"

"WWWWWWWWWW WWWWWWWWWW"

Пример 3:

"WWWWWWWWWW WWWWWWWWWW WWWWWWWWWWWWWWWWWWWW"

Разделен как

"WWWWWWWWWW WWWWWWWWWW"

"WWWWWWWWWWWWWWWWWWWW"

Пример 4:

"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"

Разделен как

"WWWWWWWWWWWWWWWWWWWW"

"WWWWWWWWWWWWWWWWWWWW"

Надеюсь, что это может помочь кому-то там :)