使用PHP将字符串拆分为一半(Word-Aware)

时间:2011-11-18 18:41:42

标签: php string split

我正在尝试将字符串分成两半,并且它不应该在一个单词的中间分开。

到目前为止,我想出了以下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

我需要在分割后保留所有符号,如:和/在字符串中。我不明白为什么当前代码正在删除符号...如果您可以提供替代方法或修复此方法不删除符号,将不胜感激:)

8 个答案:

答案 0 :(得分:19)

在查看你的示例输出时,我注意到我们的所有示例都已关闭,如果字符串的中间位于单词内部而不是给出更多内容,则我们给予string1更少。

例如,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"

在分词

上为string1提供更多内容
$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"

答案 1 :(得分:8)

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

答案 2 :(得分:1)

我知道这是一个老问题,但是我有下面的代码应该做所需的事情。

默认情况下,它在中间位置后的第一个空格处将字符串拆分。 如果中间位置后面没有空格,它将寻找中间位置之前的最后一个空格。

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:

  

“ WWWWWWWWWWWW WWWWWWWWWW WWWWWWWWWWWW WWWWWWWWWWWW”

     

被拆分为

     

“ WWWWWWWWWW WWWWWWWWWWWW”

     

“ WWWWWWWWWW WWWWWWWWWWWW”

示例2:

  

“ WWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWW WWWWWWWWWW”

     

被拆分为

     

“ WWWWWWWWWWWWWWWWWWWWWWWW”

     

“ WWWWWWWWWW WWWWWWWWWWWW”

示例3:

  

“ WWWWWWWWWWWW WWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWW”

     

被拆分为

     

“ WWWWWWWWWW WWWWWWWWWWWW”

     

“ WWWWWWWWWWWWWWWWWWWWWWWW”

示例4:

  

“ WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW”

     

被拆分为

     

“ WWWWWWWWWWWWWWWWWWWWWWWW”

     

“ WWWWWWWWWWWWWWWWWWWWWWWW”

希望这可以帮助某个人:)

答案 3 :(得分:1)

像往常一样,正则表达式为开发人员节省了大量繁琐的字符串操作调用和不必要的脚本膨胀。我什至会大胆地说正则表达式模式可能更容易理解字符串函数加载脚本。

代码:(Demo)

$text = "The Quick : Brown Fox Jumped Over The Lazy / Dog";
$halfWay = (int)(strlen($text) / 2);
var_export(
    preg_split(
        '~.{0,' . $halfWay . '}\K\s~s',
        $text,
        2
    )
);

输出:

array (
  0 => 'The Quick : Brown Fox',
  1 => 'Jumped Over The Lazy / Dog',
)

实际上,我们通过计算字符串的字符数来计算字符串的中心,然后除以二并去除所有小数位。

然后贪婪地将零匹配到 $halfWay 个字符,然后用 \K 忘记这些字符,然后在最新的限定空间上拆分字符串。 preg_split() 的第三个参数决定了可能产生的最大元素数量。

答案 4 :(得分:0)

只需更改一行:

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

str_word_count()可能不计算:或/作为单词。

答案 5 :(得分:0)

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;
}

使用此功能将字符串分成半个字..

答案 6 :(得分:0)

我创造了一个很好的解决方案,我们不会丢失角色或者这个词没有被错误地剪掉。

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>';

答案 7 :(得分:0)

我尝试使用其中两个答案,但未获得最佳结果,因此我想我会分享解决方案。我想将标题分成两半,并显示一半白色和一半绿色。

我最终结合了字数,文本长度,中点和字符串的三分之一。这使我可以确保白色部分位于第三路/半路标记之间。

我希望它可以帮助某人。请注意,在我的代码中-,&等会被认为是一个单词-它不会在测试中引起我的问​​题,但是如果我发现它无法正常工作,我将对其进行更新。

public function splitTitle($text){

    $words = explode(" ",$text);
    $strlen = strlen($text);
    $halfwaymark = ceil($strlen/2);
    $thirdwaymark = ceil($strlen/3);

    $wordcount = sizeof($words);
    $halfwords = ceil($wordcount/2);
    $thirdwords = ceil($wordcount/3);

    $string1 ='';
    $wordstep = 0;
    $wordlength = 0;


    while(($wordlength < $wordcount && $wordstep < $halfwords) || $wordlength < $thirdwaymark){
        $string1 .= $words[$wordstep].' ';
        $wordlength = strlen($string1);
        $wordstep++;
    }

    $string2 ='';
    $skipspace = 0;
    while(($wordstep < $wordcount)){
        if($skipspace==0) {
            $string2 .= $words[$wordstep];
        } else {
            $string2 .= ' '.$words[$wordstep];
        }
        $skipspace=1;
        $wordstep++;
    }

    echo $string1.' <span class="highlight">'.$string2.'</span>';

}