3 回答

TA貢獻1836條經驗 獲得超5個贊
implode(' ', array_slice(explode(' ', $sentence), 0, 10));
要增加對其他分詞符(例如逗號和破折號)的支持,可以preg_match提供一種快速的方法,并且不需要拆分字符串:
function get_words($sentence, $count = 10) {
preg_match("/(?:\w+(?:\W+|$)){0,$count}/", $sentence, $matches);
return $matches[0];
}
作為Pebbl提到,PHP不處理UTF-8或Unicode那么好,所以如果這是一個問題,那么你可以替換\w為[^\s,\.;\?\!]與\W對[\s,\.;\?\!]。

TA貢獻2039條經驗 獲得超8個贊
如果在句子結構中有一個意外的字符代替空格,或者如果句子包含多個連在一起的空格,則僅對空格進行拆分將無法正常工作。
無論您在單詞之間使用哪種“空格”,以下版本都可以使用,并且可以輕松擴展以處理其他字符...它目前支持任何空格字符加,。; ?!
function get_snippet( $str, $wordCount = 10 ) {
return implode(
'',
array_slice(
preg_split(
'/([\s,\.;\?\!]+)/',
$str,
$wordCount*2+1,
PREG_SPLIT_DELIM_CAPTURE
),
0,
$wordCount*2-1
)
);
}
正則表達式非常適合此問題,因為您可以輕松地使代碼隨心所欲地靈活或嚴格。但是,您一定要小心。我專門針對上述單詞之間的差異(而不是單詞本身)進行了上述處理,因為很難明確地說明單詞的定義。
取\w邊界一詞或其倒數\W。我很少依賴這些,主要是因為-根據您使用的軟件(例如某些版本的PHP)- 它們并不總是包含UTF-8或Unicode字符。
在正則表達式中,最好始終保持具體。這樣,無論在何處呈現表達式,表達式都可以處理以下內容:
echo get_snippet('Это не те дроиды, которые вы ищете', 5);
/// outputs: Это не те дроиды, которые
但是,就性能而言,避免拆分可能是值得的。所以,你可以用凱利的更新方法,但切換\w為[^\s,\.;\?\!]+與\W對[\s,\.;\?\!]+。盡管就我個人而言,我喜歡上面使用的拆分表達式的簡單性,但它更易于閱讀和修改。但是,PHP函數的堆棧有點難看:)
- 3 回答
- 0 關注
- 462 瀏覽
添加回答
舉報