PHP 中长字的智能自动换行?

2022-08-30 20:26:09

我正在寻找一种方法来使PHP中的自动换行更加智能。因此,它不会预先中断长单词,在一行上单独留下任何先前的小单词。

假设我有这个(真实的文本总是完全动态的,这只是为了显示):

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

此输出:

你好!
嘿嘿

看,它把小字单独放在第一行。我怎样才能让它输出更像这样的东西:

你好!heeeeeeeee
eeesaverylongword

因此,它利用每条生产线上的任何可用空间。我尝试了几个自定义函数,但没有一个是有效的(或者它们有一些缺点)。


答案 1

我已经尝试了这个智能词包装的自定义函数:

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";

编辑:发现了一些警告。这(以及本机函数)的一个主要警告是缺乏多字节支持。


答案 2

怎么样

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

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

哪些输出

hello! heeeeeeeeeeeeeeere                                                                                                                                                           
isaverylongword

str_split() 将字符串转换为$break大小的块的数组。

implode() 使用胶水将数组作为字符串连接在一起,在这种情况下,胶水是行尾标记(PHP_EOL),尽管它可以很容易地成为一个'<br/>'


推荐