![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 27.02.2009 Ostrzeżenie: (10%) ![]() ![]() |
Witam (mój pierwszy post tutaj więc proszę o wyrozumiałość gdybym napisał coś głupiego - na wszelki wypadek daje do przedszkola) (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Zrobiłem stronę www działającą na kilku dziwacznych wersjach językowych - arabski, chiński, japoński (negoist.com -- uwaga strona dla dorosłych (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) i mam problem kosmetyczny z wyświetlaniem wstępów do opisów na stronie głównej. Żeby wyświetlić tylko pierwsze 300 znaków opisu bez formatowania robię tak: Kod mb_internal_encoding("UTF-8"); $short_text = mb_substr(strip_tags($pr[text]), 0, 300); Wszystko ok, tylko czasem utnie tekst w środku słowa, co mi się nie podoba i chciałem po prostu obciąć wszystko do pierwszej spacji od końca. napisałem więc prostą linijkę kodu: Kod while($short_text[mb_strlen($short_text)-1]!=' ')$short_text=mb_substr($short_text, 0, -1); Wszystko działa w wersji angielskiej, w chińskich, arabskich itp... się zapętla, czyli nie znajduje spacji (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Próbowałem też zamiast tego mb_substr z "-1" używać: Kod function removeCharAt($str, $int){ return substr_replace($str,"",$int,1); } ale efekt ten sam... Ma ktoś jakiś pomysł na rozwiązanie problemu?? Na razie doszedłem do tego że dla mb mode nie prawidłowo działa operator indeksowania: Kod for($i=0; $i<mb_strlen($short_text); $i++){ echo $short_text[$i]; } zwraca połowę krótszy tekst niż: Kod echo $short_text; w dodatku na końcu jakiś pytajnik, czyli pewnie kawałek znaku... idzie byte po byte nie uwzględniając że znaki mają inną długość... Jakieś zastępstwo dla operatora indeksowania? coś w stylu: $short_text.getChar(index);?? Ten post edytował BlackPig 27.02.2009, 13:05:14 |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Na razie doszedłem do tego że dla mb mode nie prawidłowo działa operator indeksowania: Kod for($i=0; $i<mb_strlen($short_text); $i++){ echo $short_text[$i]; } Niestety nie pobierzasz tak specjalnych znaków językowych. Sposób na to Kod mb_substr($text, $i, 1, 'UTF-8'); Zamiast takiej petli Kod while($short_text[mb_strlen($short_text)-1]!=' ') uzyj http://pl.php.net/manual/pl/function.mb-strrpos.php http://forum.php.pl/index.php?showtopic=10...kracanie+tekstu Ten post edytował wookieb 27.02.2009, 13:51:52 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 27.02.2009 Ostrzeżenie: (10%) ![]() ![]() |
Kod mb_substr($text, $i, 1, 'UTF-8'); --> takie obejście problemu się sprawdza (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) natomiast z obcięciem ostatniego słowa jest jeszcze troszkę innego rodzaju problem, bo tam nie ma takich zwykłych spacji, tylko takie "kółeczko-spacje" (。), albo "przecineczko-spacje" (,), "dwukropeczko-spacje" (:), zaraz się okaże że w arabskim są jeszcze inne cuda... zadowolę się 3kropkiem na końcu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Wiec chyba nie ma wyjscia jak zdefiniowanie dla kazdego jezyka tablicy z mozliwymi spacjami.
Potem przy wyszukiwaniu ostatniej spacji Kod $pozycja=false; foreach($spacje as $spacja) { $newPozycja=mb_strrpos($ciag, $spacja,0,'utf-8'); if($newPozycja<$pozycja) $pozycja=$newPozycja; // to tak tylko dla wyszukania najmniejszej pozycji spacji } oczywiscie $ciag jest to wstepnie skrocony tekst. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 27.02.2009 Ostrzeżenie: (10%) ![]() ![]() |
Jasne tak trzeba by zrobić, ale dopóki nikt mnie do tego nie zmusi to zostawiam temat (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) tym bardziej że tam użytkownik sam dodaje kolejne wersje językowe, więc właściwie należało by mu zrobić funkcjonalność w panelu, która by pozwalała określać rodzaje spacji dla różnych wersji językowych a to już strzelanie z armaty do muchy...
Generalnie problemem było dla mnie inne zachowanie się operatora indeksowania i innych funkcji związanych ze stringami niż to znane z podstaw większości języków. O ile w przypadku funkcji wystarczy dopisać "mb_" na początku to w przypadku indeksowania trzeba było pomyśleć, a mi to akurat nie wyszło, więc dzięki za pomoc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 5.10.2025 - 19:53 |