2010-11-17 27 views
0

Ce script prend du texte, recherche les URL, les colore et crée une image png. Le problème que j'ai est avec wordwrap. Puisque je dois séparer le texte et le remettre ensemble pour colorier les liens, j'ai du mal à comprendre comment envelopper le texte. Voici le script et une image des résultats.PHP: texte enveloppé éclaté avec imagettftext

// Matches urls 
function is_a_url($text) { 
    $isurl = preg_match("((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)", $text) || preg_match("/@(\w+)/", $text) || preg_match("/#(\w+)/", $text); 
    return $isurl; 
} 

// Set defaults 
$image_width = 500; 
$image_height = 110; 
$start_x = 5; 
$start_y = 20; // initial x/y coords of text 
$fontsize = 14; 
$font = './font.ttf'; 
$angle = 0; 

$im = imagecreatetruecolor($image_width, $image_height); 

// Create some colors 
$white = imagecolorallocate($im, 255, 255, 255); 
$black = imagecolorallocate($im, 51, 51, 51); 
$linkcolor = imagecolorallocate($im, 51, 210, 208); 
$red = imagecolorallocate($im, 200, 0, 0); 

// Create the box 
imagefilledrectangle($im, 0, 0, $image_width, $image_height, $red); 

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

//split the text on spaces so we can eval each "word" 
$string_chunks = explode(' ', $text); 

// Takes the split and recombine 
foreach ($string_chunks as $chunk) { 
    //wrap based on image size 
    if($start_x > $image_width){ 
     $start_x = 5; 
     $start_y += 20; 
    } 
    else { 
     $image_width = $image_width - 10; 
     $output .= ($counter % 15 < 1) ? '\r' : ''; 
    } 
    // get coordinates of bounding box containing text 
    $coords = imagettfbbox($fontsize, $angle, $font, $chunk); 

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

    // figure out which color to draw in 
    $color_to_draw = is_a_url($chunk) ? $linkcolor : $black; 

    // draw the text chunk 
    imagettftext($im, $fontsize, $angle, $start_x, $start_y, $color_to_draw, $font, $chunk); 


    // adjust starting coordinates to the END of the just-drawn text 
    $start_x += $end_x; 
} 

// Save the image 
header('Content-type: image/png'); 
imagepng($im); 
imagedestroy($im); 

alt text http://dl.dropbox.com/u/19973/script.png

+1

Les mots séparés par des espaces sont faciles à diviser en plusieurs lignes. Mais vous devez d'abord comprendre comment vous voulez casser une longue URL. – stillstanding

+0

Oui, briser les URL est le principal problème. Comment pourrais-je m'y prendre? – tim

+0

Êtes-vous à l'aise avec la séparation '/'? Cela ne marchera pas toujours. Supposons que vous ayez 'http: // supercalifragilisticexpialidocious.example.com/un-segment-uri-non-break-long-long'? Cela ne correspondra pas non plus à la règle de séparation '/'. – stillstanding

Répondre

0

J'ai eu le même problème avec le texte wrap, j'ai donc écrit une petite fonction qui me aide à cela, peut-être que ça va vous aider aussi. voici donc la fonction:

function breakTextCentered($str,$num) { 
     $strs = explode(' ',$str); 
     $strlenMax = $num; 

     foreach($strs as $item) { 
      $strlenTemp += strlen(utf8_decode($item)); 
      $tempStr .= $item." "; 
      if($strlenTemp>$strlenMax) { 
       $ret .= $tempStr."\n"; 
       $strlenTemp =0; 
       $tempStr = ''; 
      } 
     } 
     if($strlenTemp<=$strlenMax) { 
      $ret .= $tempStr; 
     } 
     return $ret; 
    } 

il suffit de passer le texte et le nombre de caractères que vous voulez voir apparaître sur une ligne. il n'enveloppera le texte que sur les espaces.

+0

Le problème est que j'ai besoin d'envelopper les URLs qui ont maintenant des espaces. – tim