Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zawijanie tekstu | MODUŁ GD
Forum PHP.pl > Forum > PHP
hrabja
witam

przebrnąłem przez manual php dotyczący modułu GD i nie odnalazłem rozwiązania mojego problemu.

przyjmijmy, iż na zmiennej $tekst mam pewien kilkuset znakowy tekst.
Chcę go wyświetlić na obrazku o wymiarach 400px X 200px

używam czcionki monospace - zatem czcionki w której znaki mają taką samą szerokość.
Podział tekstu na wiersze rozwiązałem za pomocą działań matematycznych,
tj.
1) zliczam ilość znaków w tekście
2) dzielę go przez maksymalą ilość znaków w jednym wierszu i wychodzi mi liczba wierszów które są potrzebne do wyświetlenia tekstu
3) tekst dzielę na porcje i zapisuje w tablicy $tekst_do_wyświetlenia[]
4) tablice wyświetlam kolejno na obrazku za pomocą imagestring

No i pojawia się problem.
Mianowicie tekst przenoszony jest do następnego wiersza bez zachowania zasad języka polskiego,
Jakie proponujecie rozwiązanie? Może istnieje jakaś funkcja o której nie wiem a która ułatwi rozwiązanie tego problemu.

aby zobrazować mój problem, przedstawiam przykładowe teksty umieszczone w tablicy:

$tekst_do_wyświetlenia[1]="jakiś przykładowy tekst do wyświetlenia obrazku który zostanie umieszc";
$tekst_do_wyświetlenia[2]="zony na stronie www";
erix
explode" title="Zobacz w manualu PHP" target="_manual na spacje, to będziesz miał podział wg wyrazów. Przeszukaj dział przedszkole; był tam wątek na podobny temat jakiś tydzień temu.
Kamson
można ten problem rozwiązać na 2 sposoby

zakładając że

  1. <?php
  2. $string = 'używam czcionki monospace - zatem czcionki w której znaki mają taką samą szerokość';
  3. $string_limit = 20;
  4. ?>


pierwszy przy pomocy substr tnąc string i wyszukując spację

  1. <?php
  2. $run = true;
  3.  
  4.        while($run) {
  5.                $wskaznik = (isset($spacja)) ? $spacja : 0; // ustalamy wskaźnik, przy pierwszym uruchomieniu 0, dalej jest to ostatnia spacja na której skończyliśmy cięcie
  6.                $s_string = substr($string,$wskaznik,$string_limit); // pierwsze cięcie
  7.  
  8.                $spacja = strrpos($s_string,' '); // wyszukiwanie ostatniej spacji w wyniku pierwszego cięcia
  9.                if(strlen($string) > $wskaznik+$string_limit) $s_string = substr($s_string,0,$spacja); // sprawdza czy fragment którym się zajmujemy nie wystaje za nasz ciąg znaków, jeśli nie przycina wynik pierwszego ciecia do spacji
  10.                else $run = false; // jeśli tak, nie przycina już do ostatniej spacji i każe zakończyć pętla
  11.  
  12.                $wiersz[] = trim($s_string);
  13.  
  14.                $spacja += $wskaznik; // pozycja spacji dla całego stringu
  15.        }
  16. ?>


lub rozwijając na tablice:

  1. <?php
  2. $s_array = explode(' ',$string); // dzieli ciąg znaków na tablice
  3.        $wiersz_no = 0;
  4.        $wyraz = 0;
  5.        $spacje = 0;
  6.  
  7.        while($wyraz <= count($s_array)){
  8.                if(isset($wiersz[$wiersz_no])){ // podany wiersz istnieje i można zając się dodawaniem wyrazu
  9.                        if(strlen($wiersz[$wiersz_no]) + strlen($s_array[$wyraz]) + $spacje >= $string_limit) { // wyraz nie zmieści się w limicie znaków dla danego wiersza
  10.                                $wiersz_no++; // przesuwamy wskaźnik na nowy wiersz
  11.                                continue;
  12.                        }
  13.                        else { // wyraz zmieści się w limicie znaków
  14.                                $wiersz[$wiersz_no] .= " {$s_array[$wyraz]}"; // dodajemy wyraz
  15.                                $wyraz++; // przesuwamy wskaźnik na nowy wyraz
  16.                                $spacje++;
  17.                        }
  18.                }
  19.                else { // jeśli wiersz nie istniał to utworzymy go i dodamy pierwszy
  20.                        $wiersz[$wiersz_no] = $s_array[$wyraz];
  21.                        $wyraz++;
  22.                        $spacje = 0; // zerujemy ilość spacji
  23.                }
  24.        }
  25. ?>


wynik w $wiersz

Kod
Array
(
    [0] => używam czcionki
    [1] => monospace - zatem
    [2] => czcionki w której
    [3] => znaki mają taką
    [4] => samą szerokość
)


pisane z palca więc coś może nie działać poprawnie
hrabja
dziękuję za porady z całą pewnością mi się przydadzą do dalszej pracy smile.gif

obecnie problem rozwiązałem przez wykorzystanie explode(" ", $string) i jest ok, jednak na samym początku zmierzałem do nieco innego rozwiązania.

Chodziło mi o zawijanie zgodnie z zasadami języka polskiego, nie tak - aby caly wyraz został przeniesiony do nowej linijki, tylko tak aby ostatnie sylaby wyrazu nie mieszczące się w wierszu zostały ucinane. Uciąć string normalnie nie jest problemem, ale uciąć go zgodnie z zasadami języka polskiego już tak:)

chodzi o to aby w tablicy zamiast:

Array
(
[0] => używam czcionki
[1] => monospace - zatem
[2] => czcionki w której
[3] => znaki mają taką
[4] => samą szerokość
)

było

Array
(
[0] => używam czcion-
[1] => ki monospace, zatem
[2] => czcionki w któ-
[3] => rej znaki mają ta-
[4] => ką samą szerokość
)


wiem, że być może utrudniam sobie rozwiązanie, ale zależy mi na tym aby wyświetlić na obrazku jak najbardziej zbliżony do wyjustowanego tekst
erix
No to będziesz miał problem. Jedyne, co znalazłem, to to: http://szafranek.net/blog/archive/2004/09/...elenie_wyrazow/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.