web-dev-qa-db-ja.com

よりスマートなワードラップPHP長い単語の場合は?

Word-wrap in PHPを少しスマートにする方法を探しています。したがって、長い単語を事前に分割せず、前の小さな単語を1行に残します。

私がこれを持っているとしましょう(実際のテキストは常に完全に動的であり、これは単に表示するためのものです):

wordwrap('hello! heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true);

この出力:

こんにちは!
heeeeeeeeeeeeeeereisavery
ロングワード

ほら、それは最初の行に小さな単語だけを残します。どうすれば次のようなものを出力できますか?

こんにちは! heeeeeeeeeeee
eeereisaverylongword

したがって、各行で使用可能なスペースを利用します。私はいくつかのカスタム関数を試しましたが、どれも効果的ではありませんでした(またはいくつかの欠点がありました)。

15
mowgli

このスマートワードラップのカスタム関数を試してみました。

function smart_wordwrap($string, $width = 75, $break = "\n") {
    // split on problem words over the line length
    $pattern = sprintf('/([^ ]{%d,})/', $width);
    $output = '';
    $words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

    foreach ($words as $Word) {
        if (false !== strpos($Word, ' ')) {
            // normal behaviour, rebuild the string
            $output .= $Word;
        } else {
            // work out how many characters would be on the current line
            $wrapped = explode($break, wordwrap($output, $width, $break));
            $count = $width - (strlen(end($wrapped)) % $width);

            // fill the current line and add a break
            $output .= substr($Word, 0, $count) . $break;

            // wrap any remaining characters from the problem Word
            $output .= wordwrap(substr($Word, $count), $width, $break, true);
        }
    }

    // wrap the final output
    return wordwrap($output, $width, $break);
}

$string = 'hello! too long here too long here too heeeeeeeeeeeeeereisaverylongword but these words are shorterrrrrrrrrrrrrrrrrrrr';
echo smart_wordwrap($string, 11) . "\n";

[〜#〜] edit [〜#〜]:いくつかの警告を見つけました。これ(およびネイティブ関数)に関する1つの大きな注意点は、マルチバイトサポートがないことです。

16
cmbuckley

どうですか

$string = "hello! heeeeeeeeeeeeeeereisaverylongword";
$break = 25;

echo implode(PHP_EOL, str_split($string, $break));

どの出力

hello! heeeeeeeeeeeeeeere                                                                                                                                                           
isaverylongword

str_split()は、文字列を$ breakサイズのチャンクの配列に変換します。

implode()は、接着剤を使用して配列を文字列として結合します。接着剤は、この場合は行末マーカー(PHP_EOL)ですが、簡単に '<br/> '

13
frglps

これも解決策です(ブラウザなどの場合)。

$string = 'hello! heeeeeeeeeeeeeeeeeeeeeereisaverylongword';
echo preg_replace('/([^\s]{20})(?=[^\s])/', '$1'.'<wbr>', $string);

20文字以上の単語に<wbr>を配置します

<wbr>は「単語の中断の機会」を意味するため、必要に応じて中断しますのみ(要素/ブラウザ/ビューア/その他の幅で指定)。それ以外の場合は見えません。

固定幅がない流動的/レスポンシブレイアウトに適しています。そして、phpのワードラップのように奇妙にラップしません

11
mowgli

CSSを使用してこれを実現できます。

Word-wrap: break-Word;

それはあなたのためにみことばを壊します。実際の動作を確認するためのリンクは次のとおりです。

http://www.css3.info/preview/Word-wrap/

5
brenjt

これでうまくいくはずです...

$Word = "hello!" . wordwrap('heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true);
echo $Word;
2
Paul Dessert