PHP:用于换行的测试行长度

Posted

技术标签:

【中文标题】PHP:用于换行的测试行长度【英文标题】:PHP: test line length for wrapping 【发布时间】:2011-04-06 07:30:10 【问题描述】:

如何测试一个块是否超过图像大小并将该文本换行到下一行。不确定我的 if 语句是否正确。

$text="Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem http://somelongurl.com/then-we-make-it-super-long-with-some-more/ Lorem Ipsum Lorem Ipsum Lorem Ipsum";

$string_chunks = explode(' ', $text);

foreach ($string_chunks as $chunk) 

    if($end_x + $chunk > $image_width)
        $start_x = 5;
        $start_y += 20;
    

   $coords = imagettfbbox($fontsize, $angle, $font, $chunk);

   $end_x = $coords[0] + $coords[4] + 10;

   $color_to_draw = is_a_url($chunk) ? $linkcolor : $black; 

   imagettftext($im, $fontsize, $angle, $start_x, $start_y, $color_to_draw, $font, $chunk);

   $start_x += $end_x;

使用此代码,我得到:

Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem 
http://somelongurl.com/then-we-make-it-super-long-with-some-more/
Lorem Ipsum Lorem Ipsum Lorem Ipsum

我希望发生的事情是这样的:

Lorem Ipsum Lorem Ipsum Lorem Ipsum 
Lorem http://somelongurl.com/then-we
-make-it-super-long-with-some-more/
Lorem Ipsum Lorem Ipsum Lorem Ipsum

【问题讨论】:

【参考方案1】:

使用wordwrap并将第四个参数$cut作为true传递给它,以强制破坏URL。

Live example.

【讨论】:

这将是最简单的,但我已经尝试过但似乎无法让它工作。 @timg 有什么问题?检查我添加的链接。 尝试使用带有爆炸文本的 imagettftext 进行操作,它不起作用。 @timg 我不确定我明白你在说什么。 imagettftext 是否忽略换行符? 因为我正在分解文本以检查 url 并在 imagettftext 之前为它们着色,所以文本是分段的,没有换行符。【参考方案2】:

我想我知道你想要实现什么。我没有测试下面的代码,所以它可能需要一些润色和重新测试/测试。但它应该给你一个很好的起点

<?php
$text = "Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem http://somelongurl.com/then-we-make-it-super-long-with-some-more/ Lorem Ipsum Lorem Ipsum Lorem Ipsum";
$string_chunks = explode(' ', $text);

foreach ($string_chunks as $chunk) 
    $_start_bit = false;
    // before anything else check if chunk is url
    $color_to_draw = is_a_url($chunk) ? $linkcolor : $black; 
    // check if chunk is to long
    if(strlen($chunk) > $image_width) 
        // if there is allredy a word in the current line
        // make the first bit $imagewidth - current line width
        if ($start_x > 5) 
            $_start_bit = substr($chunk, 0, ($image_width - $start_x));
            $chunk = str_replace($_start_bit, "", $chunk);
        
        $_chunkbits = wordwrap($chunk, $image_width, "\n", true);
        $_chunkbits = explode("\n", $_chunkbits);
        if($_start_bit) 
            array_unshift($_chunkbits, $_start_bit);
        
        // loop bits and draw them
        foreach ($_chunkbits as $bit) 
            if($end_x + $bit > $image_width)
                $start_x = 5;
                $start_y += 20;
            
            $coords = imagettfbbox($fontsize, $angle, $font, $bit);
            $end_x = $coords[0] + $coords[4] + 10;
            imagettftext($im, $fontsize, $angle, $start_x, $start_y, $color_to_draw, $font, $bit);
            $start_x += $end_x;
        
        unset($_chunkbits);
     else 
        if($end_x + $chunk > $image_width)
            $start_x = 5;
            $start_y += 20;
        
        $coords = imagettfbbox($fontsize, $angle, $font, $chunk);
        $end_x = $coords[0] + $coords[4] + 10;
        imagettftext($im, $fontsize, $angle, $start_x, $start_y, $color_to_draw, $font, $chunk);
        $start_x += $end_x;
    

【讨论】:

【参考方案3】:
if($end_x + $chunk > $image_width) 
    $start_x = 5; 
    $start_y += 20; 
 

一个主要错误,$end_x + (strlen($chunk)*$charPXsize) > $image_width 另一个错误,如果一行长于 $image_width 会发生什么?它会在下一行打印出来,但无论如何都会太长。

【讨论】:

我更改了我的问题以反映我希望图像的包装方式。【参考方案4】:

我所做的是遍历字符串,每次检查边界框是否太宽。如果是这样,请插入一个新行并继续,直到您使用完所有文本。然后全部写成一个大字符串...

$chunks = explode(' ', $text);
$wrappedText = '';
foreach ($chunks as $chunk) 
    $coords = imagettfbbox($fontsize, $angle, $font, $wrappedText.' '.$chunk);
    $width = $coords[2] - $coords[0];
    if ($width > $myMaxWidth) 
        $wrappedText .= "\n" . $chunk;
     else 
        $wrappedText .= ' ' . $chunk;
    

imagettftext(
    $im, 
    $fontsize, 
    $angle, 
    $start_x, 
    $start_y, 
    $color_to_draw, 
    $font, 
    $wrappedText
);

现在,请注意,这不会为您的链接着色...但是,您始终可以在其中添加一种检测方法来确定链接将被写入的确切位置,并用您的颜色覆盖它(如果它在那里)。 ..

【讨论】:

这会产生阶梯式输出,而不是换行文本。 它产生包装的文本。它只是没有预先计算宽度(因为你不能,因为 TrueType 字体不是固定宽度)...... 啊,我明白你的意思了。如果您有一个比框长的“单词”(您的 URL),它只会将每个新单词添加到其自己的新行之后。您需要在宽度检查之后添加另一个检查,以查看它本身是否太长(然后将其拆分) 在查看了这个之后,它只是一遍又一遍地重复文本的第一行。

以上是关于PHP:用于换行的测试行长度的主要内容,如果未能解决你的问题,请参考以下文章

VB中label控件的文字换行

IDEA如何设置代码超出长度限制时自动换行

c语言如何计算n行字符串的长度?

java swing JPanel 怎么实现换行Flowlayout的布局管理器

设置MyEclipse中代码的换行长度

GetConsoleScreenBufferInfo 获取单个控制台行的长度