还有另一种方式:
<?php
$someBigString = <<<SAMPLE
This, actually, is a nice' old'er string, as they said, "divided and conquered".
SAMPLE;
// change this to whatever you need to:
$number_of_words = 7;
$arr = preg_split("#([a-z]+[a-z'-]*(?<!['-]))#i",
$someBigString, $number_of_words + 1, PREG_SPLIT_DELIM_CAPTURE);
$res = implode('', array_slice($arr, 0, $number_of_words * 2));
echo $res;
演示。
我认为这里preg_split
有一个更好的工具(比str_word_count
)。不是因为后者不灵活(不是:你可以用它的第三个参数定义什么符号可以组成一个词),而是因为preg_split
在获得 N 个项目后基本上会停止处理字符串。
这个函数很常见的技巧是捕获分隔符,然后使用它们来重建字符串,其中包含前 N 个单词(其中 N 给出)并保存标点符号。
(当然,我的示例中使用的正则表达式并不严格遵守与str_word_count
语言环境相关的行为。但它仍然限制单词由字母'
和-
符号组成,后两者不在任何单词的开头和结尾)。