Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] rozbijanie tekstu na podstawie szerokości i spacji
Krisu
post
Post #1





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował Krisu 5.07.2008, 17:48:56
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
webdice
post
Post #2


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Proszę o dodanie tytułu tematu, sam tag to nie tytuł.
Go to the top of the page
+Quote Post
Szunaj85
post
Post #3





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował Szunaj85 5.07.2008, 18:57:58


--------------------
Jeśli Ci pomogłem wciśnij Jeśli mi pomożesz wcisnę
Go to the top of the page
+Quote Post
Krisu
post
Post #4





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Krisu 5.07.2008, 19:18:12
Go to the top of the page
+Quote Post
Szunaj85
post
Post #5





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował Szunaj85 5.07.2008, 21:10:14


--------------------
Jeśli Ci pomogłem wciśnij Jeśli mi pomożesz wcisnę
Go to the top of the page
+Quote Post
Krisu
post
Post #6





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

Ostrzeżenie: (0%)
-----


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.




Ten post edytował Krisu 5.07.2008, 21:06:42
Go to the top of the page
+Quote Post
Szunaj85
post
Post #7





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


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.


--------------------
Jeśli Ci pomogłem wciśnij Jeśli mi pomożesz wcisnę
Go to the top of the page
+Quote Post
Krisu
post
Post #8





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Szunaj85
post
Post #9





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował Szunaj85 5.07.2008, 21:30:12


--------------------
Jeśli Ci pomogłem wciśnij Jeśli mi pomożesz wcisnę
Go to the top of the page
+Quote Post
Krisu
post
Post #10





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Szunaj85
post
Post #11





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


A właśnie to jest obrazek czy zrobiłeś to na tabelach?

Ten post edytował Szunaj85 5.07.2008, 21:37:02


--------------------
Jeśli Ci pomogłem wciśnij Jeśli mi pomożesz wcisnę
Go to the top of the page
+Quote Post
Krisu
post
Post #12





Grupa: Zarejestrowani
Postów: 211
Pomógł: 0
Dołączył: 30.03.2006
Skąd: Żary

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 19:44