Word-wrap in PHPを少しスマートにする方法を探しています。したがって、長い単語を事前に分割せず、前の小さな単語を1行に残します。
私がこれを持っているとしましょう(実際のテキストは常に完全に動的であり、これは単に表示するためのものです):
wordwrap('hello! heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true);
この出力:
こんにちは!
heeeeeeeeeeeeeeereisavery
ロングワード
ほら、それは最初の行に小さな単語だけを残します。どうすれば次のようなものを出力できますか?
こんにちは! heeeeeeeeeeee
eeereisaverylongword
したがって、各行で使用可能なスペースを利用します。私はいくつかのカスタム関数を試しましたが、どれも効果的ではありませんでした(またはいくつかの欠点がありました)。
このスマートワードラップのカスタム関数を試してみました。
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つの大きな注意点は、マルチバイトサポートがないことです。
どうですか
$string = "hello! heeeeeeeeeeeeeeereisaverylongword";
$break = 25;
echo implode(PHP_EOL, str_split($string, $break));
どの出力
hello! heeeeeeeeeeeeeeere
isaverylongword
str_split()は、文字列を$ breakサイズのチャンクの配列に変換します。
implode()は、接着剤を使用して配列を文字列として結合します。接着剤は、この場合は行末マーカー(PHP_EOL)ですが、簡単に '<br/>
'
これも解決策です(ブラウザなどの場合)。
$string = 'hello! heeeeeeeeeeeeeeeeeeeeeereisaverylongword';
echo preg_replace('/([^\s]{20})(?=[^\s])/', '$1'.'<wbr>', $string);
20文字以上の単語に<wbr>
を配置します
<wbr>
は「単語の中断の機会」を意味するため、必要に応じて中断しますのみ(要素/ブラウザ/ビューア/その他の幅で指定)。それ以外の場合は見えません。
固定幅がない流動的/レスポンシブレイアウトに適しています。そして、phpのワードラップのように奇妙にラップしません
CSSを使用してこれを実現できます。
Word-wrap: break-Word;
それはあなたのためにみことばを壊します。実際の動作を確認するためのリンクは次のとおりです。
これでうまくいくはずです...
$Word = "hello!" . wordwrap('heeeeeeeeeeeeeeereisaverylongword', 25, '<br />', true);
echo $Word;