PHP: длина тестовой строки для переноса - PullRequest
4 голосов
/ 31 августа 2010

Как я могу проверить, превышает ли чанк размер изображения, и перенести этот текст на следующую строку.Не уверен, правильно ли я делаю это с моим оператором 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

Ответы [ 4 ]

2 голосов
/ 31 августа 2010

Используйте wordwrap и передайте ему четвертый параметр, $cut, как true для принудительного разрыва URL.

Живой пример .

1 голос
/ 01 сентября 2010

Я думаю, я знаю, чего ты хочешь достичь.Я не тестировал приведенный ниже код, поэтому он может потребовать некоторого улучшения и повторного тестирования.но это должно дать вам хорошую отправную точку

<?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;
    }
}
0 голосов
/ 31 августа 2010

Что я сделал, так это перебрал строку, каждый раз проверяя, не становится ли ограничивающий прямоугольник слишком широким. Затем, если это произойдет, вставьте новую строку и продолжайте, пока вы не израсходуете весь свой текст. Тогда напишите все это как одну большую строку ...

$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
);

Теперь, обратите внимание, что это не будет окрашивать ваши ссылки по-другому ... Но вы всегда можете добавить туда метод обнаружения, чтобы определить точное положение, в котором будет написана ссылка, и перезаписать ее своим цветом, если она там есть. ..

0 голосов
/ 31 августа 2010
if($end_x + $chunk > $image_width){ 
    $start_x = 5; 
    $start_y += 20; 
} 

Одна главная ошибка, $ end_x + (strlen ($ chunk) * $ charPXsize)> $ image_width Еще одна ошибка, что произойдет, если строка длиннее, чем $ image_width? Он будет распечатан на следующей строке, но все равно будет слишком длинным.

...