Разделить строки пополам (Word-Aware) с PHP - PullRequest
11 голосов
/ 18 ноября 2011

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

До сих пор я придумал следующее, что работает на 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

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

Ответы [ 6 ]

20 голосов
/ 18 ноября 2011

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

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

дает меньше для строки1 для слова для разделения

$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"

дает больше для строки1 в слове для разделения

$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"
8 голосов
/ 18 ноября 2011
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

1 голос
/ 07 июня 2019

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

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

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 WWWWWWWWWWW *

разделяется как

" WWWWWWWWWW WWWWWWWWWW "

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
Пример 2:

"WWWWWWWWWWWWWWWWWWWW WWWWWWWWWW WWWWWWWWWW"

1028 * распределятся
1030 * "WWWWWWWWWWWWWWWWWWWW"
1032 * "WWWWWWWWWW WWWWWWWWWW"

Пример 3:

" WWWWWWWWWW WWWWWWWWWW WWWWWWWWWWWWWWWWWWWWW

делится на

"WWWWWWWWWWWWW "

" WWWWWWWWWWWWWWWWWWWW "

Пример 4:

" WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

"WWWWWWWWWWWWWWWWWWWW"

"WWWWWWWWWWWWWWWWWWWW"

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

0 голосов
/ 17 февраля 2017

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

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>';
0 голосов
/ 19 июля 2013
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;
}

Используйте эту функцию, чтобы разбить строку на половину слов ..

0 голосов
/ 18 ноября 2011

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

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

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

...