Pomoc - Szukaj - U¿ytkownicy - Kalendarz
Pe³na wersja: [PHP] rozbijanie tekstu na podstawie szeroko¶ci i spacji
Forum PHP.pl > Forum > Przedszkole
Krisu
Witam,

mam problem, gdy¿ nie wiem jak najpeiej napisaæ program, by by³ jak najbardziej optymalny w dzia³aniu, proszê o radê.

Zadanie


Mam tekst i sprawdzam jego d³ugo¶æ funkcj±

  1. <?php
  2. function width($size, $angle, $fontfile, $text) {
  3.  
  4. $ww = imagettfbbox($size, $angle, $fontfile, $text);
  5.  
  6. $ww[&apos;w&apos;] = abs($ww[2] + 1);
  7.  
  8. return $ww;
  9.  
  10. }
  11. ?>
zwraca mi ona szeroko¶æ danej zmiennej do której jest przypisany tekst, w pikselach.

Nastêpnie stawiam warunek, co ma siê staæ z tym tekstem, je¿eli bêdzie on d³u¿szy ni¿ 350 px.

Ca³a trudno¶æ polega na tym, ¿e tekst ma byæ pisany w jednej linii do ostatniej spacji, która jest przed warto¶ci± 350 px, nastêpnie pozosta³a czê¶æ tekstu ma zostaæ przeniesiona do nastêpnej linii ju¿ w ca³o¶ci.

Przyk³ad

Tekst ma 380 pikseli szeroko¶ci, a ostatnia spacja przed 350 px znajduje siê na szeroko¶ci 345 px. Czyli ca³y tekst dzielimy na 2 czê¶ci t± do 345px i t± co zostanie. Jak to zrobiæ?
webdice
Proszê o dodanie tytu³u tematu, sam tag to nie tytu³.
Szunaj85
A po co się tak męczysz nie łatwiej tak:
  1. <?php
  2. $tekst="xxxxxxxx xxxxxxx xxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxx xxxxxxxx xxxxxxx";
  3. $nowytekst = wordwrap($tekst, 100,"<br />", 1);
  4. echo $nowytekst
  5. ?>

Gdzie:
wordwrap() - pozwala na formatowanie tekstu
100 - maksymalna dlugość znaków w lini
<br /> - sposób w jaki łamiesz tekst
1 - bezwzględnie łamie ciąg znaków jeżeli przekroczy on 100
"xxx..." - to tekst
Poprawiłem błędy w kodzie ohmy.gif
Krisu
Wyliczanie szerokości tekstu, jest związane z tym, że wszystkie operacje wykonuję na obrazie. Najpierw nakładam 1 linię, a potem w odpowiednim miejscu nakładam 2 linię tekstu, co niesie mniejsze prawdopodobieństwo popełnienia błędu.

Poza tym Twój skrypt nie działa mi za bardzo... do funkcji wordwrap nie trzeba mieś włączonej jakiejś biblioteki?

Bo po mimo poprawnego kolorowania składni, wysypuje się kod.

Mój błąd... nie poprawiłem w kodzie <? na <?php i dlatego wywaliło mi kod.

Teraz dopiero widzę zasadę działania funkcji. Hmm w sumie to myślę, że dało by się ten problem załatwić w ten sposób, ale chciałbym zobaczyć, czy może ktoś jeszcze ma inne pomysły na ten temat.

Teoretycznie pomysł byłby idealny, gdyby puścić pętle sprawdzającą szerokość każdej literki i po otrzymaniu wyniku 350 px zwracałaby ilość wykorzystanych znaków, wówczas tą zmienna podstawiałoby się do funkcji wordwrap.

Co o tym myślicie, bo ja zastanawiam się, czy pętla jest optymalnym rozwiązaniem.?

Zrobi³em to w taki sposób... dzia³aæ dzia³a, ale jest trochê ma³o wydajny...

Mo¿e kto¶ co¶ doradzi??

  1. <?php
  2.  
  3. $size = 9.5;
  4.  
  5. $angle = 0;
  6.  
  7. $font = 'engine/fonts/verdana.ttf';
  8.  
  9. function width($size, $angle, $fontfile, $text) {
  10.  
  11. $ww = imagettfbbox($size, $angle, $fontfile, $text);
  12.  
  13. $ww['w'] = abs($ww[2] + 1);
  14.  
  15. return $ww;
  16.  
  17. }
  18.  
  19. $tekst= "xxxxxxxx xxxxxxx xxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxx xxxxxxxx xxxxxxx";
  20.  
  21. $tekstW = width($size, 0, $font, $tekst);
  22.  
  23. if ($tekstW['w'] > 350) {
  24.  
  25. $a = 0;
  26.  
  27. for ($i = 0; $i < 70; $i++) {
  28.  
  29. $licz[$i] = width($size, 0, $font, $tekst[$i]);
  30.  
  31. $a += $licz[$i]['w'];
  32.  
  33. $suma = 0 + $a;
  34.  
  35. if ($suma == 350 || $suma == 349 || $suma == 348 || $suma == 347 || $suma == 346 || $suma == 345 || $suma == 344 || $suma == 343 || $suma == 342 || $suma == 341 || $suma == 340) { $liczba = $i; }
  36.  
  37. }
  38.  
  39. width($size, 0, $font, $eja[$i]);
  40.  
  41. $nowytekst = wordwrap($tekst, $liczba, '<br />', 1);
  42.  
  43. $nowytekst = explode('<br />', $nowytekst); 
  44.  
  45. echo $nowytekst[0].'<br />'.$nowytekst[1];
  46.  
  47. }
  48.  
  49. $echo = width($size, 0, $font, 'xxxxxxxx xxxxxxx xxxxxxx xxxxxxxxxxx xxxxxxx');
  50.  
  51. echo $echo['w'];
  52.  
  53. ?>
Szunaj85
Nie pisałeś, że to ma być tekst oparty o czcionki ttf. Teraz rozumiem o co Ci chodziło. Jednak czy jesteś pewien, że skrypt działa bo mnie wyskakuje błąd w 11 linijce twojego kodu sadsmiley02.gif
Krisu
Działa na 100%, a błąd polega na tym, że w katalogu engine/fonts nie masz czcionki verdany.

żeby wszystko działało musisz ją skopiować do bieżącego katalogu i podać jej nazwę.

Ja zaś chciałbym bardziej zoptymalizować kod, ale nie wiem jak.

Chodzi o to, by na poniższym obrazku nie ucinało tekstu, tylko przenosiło go do kolejnej linii.

Tekst, który został naniesiony na obrazek...

Cytat
Uwolniłeś/aś swoich 99 jednostek i zaprzyjaźnionych1 jednostek.


Szunaj85
Je¿eli chodzi o czcionkê ttf to skopiowa³em j± na serwer i wpisa³em odpowiedni± ¶cie¿kê. Wiêc chyba nie tu tkwi problem. Jednak domy¶lam siê gdzie. Je¿eli tobie dzia³a to widocznie wszystko jest ok.
Krisu
Mo¿liwe, ¿e to wina konfiguracji serwera. Chcia³bym daæ Ci repa za pomoc, ale chcia³bym, ¿eby jeszcze kto¶ pomóg³ mi zoptymalizowaæ ten kod.
Bo nie widzi mi siê wykonywanie pêtli 70 razy, je¶li literek jest ok 50...
Szunaj85
Wiesz pierwszy problem to przenieść tekst do nowej lini tak żeby Ci nie ucinało tekstu, a drugi problem to stworzyć miejsce na 2 linijki (lub więcej) tekstu. Nie wiem może przekroić obrazek w miejscu gdzie wyświetlasz tekst i sztucznie go wydłużać za pomocą skryptu PHP. czarodziej.gif
Krisu
No co¶ Ty, to ju¿ ¿aden problem smile.gif

Jeden if kod jest d³u¿szy ni¿ 350 px, to jaka¶ tam zmienna = dodatkowe miejsce czyli ok 20px wolnego pola, a potem, przy tworzeniu obrazka zamiast dac gotowe wymiary dodajesz ta zmienna i do wszystkich rzeczy, które s± pod wolnym polem, a sam tekst (a raczej drug± czê¶æ) osadzasz w wolnym miejscu.

Nie wiem, czy wyrazi³em siê jasno, ale dziêki za pomoc. Naprawdê mi pomog³e¶ smile.gif

Pozdrawiam.
Szunaj85
A właśnie to jest obrazek czy zrobiłeś to na tabelach?
Krisu
To wszystko to jest jeden obrazek.

Cytat
Temat: Village of Grimness zaatakowa³/a ANUSIAK
Wys³ana: 26.02.08 o 13:08:01 Godz.

Napastnik Nikkodem z osady Village of Grimness
[Pa³karz] [Oszczepnik] [Topornik] [Zwiadowca] [Paladyn] [Germañski Rycerz] [Taran] [Katapulta] [Wódz] [Osadnik] [Bohater]
Jednostki 0 0 4168 0 0 927 0 0 0 0 1
Straty 0 0 129 0 0 29 0 0 0 0 0
Jeñcy 0 0 81 0 0 18 0 0 0 0 0
Informacja Uwolni³e¶/a¶ swoich 99 jednostek i zaprzyja¼nionych1 jednostek.
Zdobycz 13439 12857 14015 55100

Obroñca wlatca moch z osady ANUSIAK
[Falanga] [Miecznik] [Tropiciel] [Grom Teutatesa] [Je¼dziec Druidzki] [Haeduan] [Taran] [Trebusz] [Herszt] [Osadnicy]
Jednostki 422 10 23 2 15 167 0 0 0 0
Straty 422 10 23 2 15 167 0 0 0 0


Kopiuj±c taki tekst otrzymujesz w³a¶nie obrazek.
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.