22

私はの線に沿って何かを探しています

str_split_whole_word($longString, $x)

ここ$longStringで、は文のコレクションであり、$xは各行の文字長です。かなり長くなる可能性があるので、基本的には配列の形で複数の行に分割したいと思います。

例えば:

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';
$lines = str_split_whole_word($longString, $x);

必要な出力:

$lines = Array(
    [0] = 'I like apple. You'
    [1] = 'like oranges. We'
    [2] = and so on...
)
4

5 に答える 5

59

最も簡単な解決策は、次のように改行でを使用することですwordwrap()explode()

$array = explode( "\n", wordwrap( $str, $x));

$x文字列を折り返す文字の数はどこにありますか。

于 2012-06-29T00:46:24.623 に答える
19

このコードは単語を壊さないようにします。wordwrap()を使用して取得することはありません。

最大長は、を使用して定義され$maxLineLengthます。私はいくつかのテストを行いましたが、正常に動作します。

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';

$words = explode(' ', $longString);

$maxLineLength = 18;

$currentLength = 0;
$index = 0;

foreach ($words as $word) {
    // +1 because the word will receive back the space in the end that it loses in explode()
    $wordLength = strlen($word) + 1;

    if (($currentLength + $wordLength) <= $maxLineLength) {
        $output[$index] .= $word . ' ';
        $currentLength += $wordLength;
    } else {
        $index += 1;
        $currentLength = $wordLength;
        $output[$index] = $word;
    }
}
于 2012-06-29T04:39:09.573 に答える
13

改行を挿入してから、それらwordwrap()の改行を挿入するために使用します。explode()

// Wrap at 15 characters
$x = 15;
$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';
$lines = explode("\n", wordwrap($longString, $x));

var_dump($lines);
array(6) {
  [0]=>
  string(13) "I like apple."
  [1]=>
  string(8) "You like"
  [2]=>
  string(11) "oranges. We"
  [3]=>
  string(13) "like fruit. I"
  [4]=>
  string(10) "like meat,"
  [5]=>
  string(5) "also."
}
于 2012-06-29T00:46:49.850 に答える
2

preg_このタスク全体は、1回の関数呼び出しで実行できます。

  1. ゼロと時間の間の任意の文字に一致します$maxLength
  2. #1から一致した文字を忘れて/解放し\Kます。
  3. 次の1つ以上の空白文字または文字列の終わりに一致します。ここで一致する文字/位置は分割プロセスで消費され、出力配列には表示されません。
  4. preg_文字列位置の終わりを。で分割することによって生成される空の要素を除外するように関数を設定しPREG_SPLIT_NO_EMPTYます。

コード:(デモ

$longString = 'I like apple. You like oranges. We like fruit. I like meat, also.';
$maxLength = 18;

var_export(
    preg_split("/.{0,{$maxLength}}\K(?:\s+|$)/", $longString, 0, PREG_SPLIT_NO_EMPTY)
);

出力:

array (
  0 => 'I like apple. You',
  1 => 'like oranges. We',
  2 => 'like fruit. I like',
  3 => 'meat, also.',
)

入力文字列に改行が含まれている可能性がある場合は、sパターン修飾子を追加するだけです。
/.{0,{$maxLength}}\K(?:\s+|$)/sデモ

于 2020-09-25T07:00:22.690 に答える
2

私の要件は、ブレークワードなしで20文字ごとにテキスト文字列を分割することでした。ワードラップ()を使用して、20文字ごとに改行を挿入します。これが私が行う方法です。これがこのタイプのソリューションだと思っている他の人に役立つことを願っています。

$charactersLimit = 20;
$yourTextString = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
$output = explode("\n", wordwrap($yourTextString, $charactersLimit));

次のような出力:

Array
(
    [0] => Lorem ipsum dolor
    [1] => sit amet,
    [2] => consectetuer
    [3] => adipiscing elit.
)
于 2020-09-30T07:54:38.003 に答える