別の方法があります:
<?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
ます。後者が柔軟性に欠けるからではありません (そうではありません: 3 番目のパラメーターで単語を構成できる記号を定義できます) が、preg_split
N 個の項目を取得した後に文字列の処理を本質的に停止するからです。
この関数で非常に一般的なトリックは、区切り文字もキャプチャし、それらを使用して、最初の N 個の単語 (N が指定されている場合) と句読点が保存された文字列を再構築することです。
str_word_count
(もちろん、私の例で使用されている正規表現は、ロケール依存の動作に厳密には準拠していません。ただし、単語がアルファ'
と-
記号で構成されるように制限されており、後者の 2 つは単語の先頭と末尾ではありません)。