PHP -将字符串拆分为两个相等的部分,但第二个字符串中的单词更多

vc6uscn9  于 2023-11-16  发布在  PHP
关注(0)|答案(4)|浏览(119)

我有一个函数,可以根据字符串中的单词数量将字符串分成两个相等的部分。然后我将两个新字符串 Package 在单独的span s中。如果原始字符串中有奇数个单词,我希望第二个跨度包含1个额外的单词。
当前,附加字将转到第一个span

$array  = explode( ' ', 'Lorem ipsum dolor sit amet' );
$count = count( $array );
$per_part = max( round( $count / 2 ), 1 );
$new_array     = [];

for ( $i = 0; $i < 2; $i++ ) {
    $new_array[] = array_slice( $array, $i * $per_part, $per_part );
}

$first_string = join(' ', $new_array[0]);
$second_string = join(' ', $new_array[1]);

$new_string = '<span>' . $first_string . '</span>' . ' <span>' . $second_string . '</span>';
echo htmlspecialchars($new_string);

字符串
当前结果:

<span>Lorem ipsum dolor</span> <span>sit amet</span>


预期结果:

<span>Lorem ipsum</span> <span>dolor sit amet</span>

tkclm6bt

tkclm6bt1#

通过将总字数除以2来计算每部分的字数。这将给予您第一部分的字数。然后,计算将添加到第二部分的剩余字数。

$array = explode( ' ', 'Lorem ipsum dolor sit amet' );
$count = count( $array );
$per_part = floor( $count / 2 );
$remaining_words = $count - $per_part;

$new_array = [];

$new_array[] = array_slice( $array, 0, $per_part );
$new_array[] = array_slice( $array, $per_part );

$first_string = join(' ', $new_array[0]);
$second_string = join(' ', $new_array[1]);

$new_string = '<span>' . $first_string . '</span>' . ' <span>' . $second_string . '</span>';
echo htmlspecialchars($new_string); //Expected Output: <span>Lorem ipsum</span> <span>dolor sit amet</span>

字符串
floor( $count / 2 )用于确保当总计数为奇数时,第一部分获得大部分单词。然后将剩余单词添加到第二部分。这样,如果原始字符串中有奇数个单词,第二个跨度将包含1个额外的单词。

9jyewag0

9jyewag02#

你可以尝试根据总字数是偶数还是奇数来计算每个部分应该包含多少单词,如果是偶数,两个部分将包含相同数量的单词,如果是奇数,第一部分将包含一个额外的单词。

$array  = explode( ' ', 'Lorem ipsum dolor sit amet' );
$count = count( $array );
$per_part = max(ceil($count / 2), 1);
$new_array     = [];

for ($i = 0; $i < 2; $i++) {
    $new_array[] = array_slice($array, $i * $per_part, $per_part);
}

if ($count % 2 === 1) {
    $last_word = array_pop($new_array[0]);
    array_unshift($new_array[1], $last_word);
}

$first_string = join(' ', $new_array[0]);
$second_string = join(' ', $new_array[1]);

$new_string = '<span>' . $first_string . '</span>' . ' <span>' . $second_string . '</span>';
echo htmlspecialchars($new_string);

字符串
编辑:使用ceil并添加了一个条件,如果有奇数个单词,则将最后一个单词从第一部分移动到第二部分

bprjcwpo

bprjcwpo3#

我认为你可以使用ceil()来舍入结果,这样,如果结果的单词数是奇数,额外的单词将进入第二个span:

$per_part = max(ceil($count / 2), 1);

字符串

uidvcgyl

uidvcgyl4#

this earlier answer about how to split a string in half类似,您可以计算单词总数的一半并向下舍入。然后使用正则表达式模式匹配这两半并将其 Package 在span标记中。
请注意,我的代码段甚至是标点安全的,并努力适应松散的连字符和收缩。一些边缘情况仍然会造成麻烦,但我不知道你的输入数据可能会有什么变化。
代码:(Demo

$text = "The Quick : Brown Fox Jumped Over The Lazy / Dog";
$wordCountInFirstHalf = intdiv(str_word_count($text), 2);
echo preg_replace(
         "~((?:[\w'-]+[^\w'-]*?){{$wordCountInFirstHalf}})(\s*)(.*)~",
         '<span>$1</span>$2<span>$3</span>',
         $text
     );

字符串
输出量:

<span>The Quick : Brown Fox</span> <span>Jumped Over The Lazy / Dog</span>


我认为声明这个代码段不是为了正确处理一个单词的字符串而构建的是有责任的。在这种情况下,你最好写一个条件来检查单词计数是否为1,然后按照你的意愿处理它,而不是调用preg_replace()

相关问题