Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] MB mode i obcięcie ostatniego słowa w stringu
Forum PHP.pl > Forum > Przedszkole
BlackPig
Witam (mój pierwszy post tutaj więc proszę o wyrozumiałość gdybym napisał coś głupiego - na wszelki wypadek daje do przedszkola) 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 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 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);??
wookieb
Cytat(BlackPig @ 27.02.2009, 13:04:50 ) *
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
BlackPig
Kod
mb_substr($text, $i, 1, 'UTF-8');

--> takie obejście problemu się sprawdza 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 smile.gif
wookieb
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.
BlackPig
Jasne tak trzeba by zrobić, ale dopóki nikt mnie do tego nie zmusi to zostawiam temat 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 smile.gif
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.