Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] MB mode i obcięcie ostatniego słowa w stringu, problem z funkcją mb_substr() i zatrzymaniem pętli :)
BlackPig
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 27.02.2009

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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

Ten post edytował wookieb 27.02.2009, 13:51:52
Go to the top of the page
+Quote Post
BlackPig
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 27.02.2009

Ostrzeżenie: (10%)
X----


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)
Go to the top of the page
+Quote Post
wookieb
post
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.
Go to the top of the page
+Quote Post
BlackPig
post
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 27.02.2009

Ostrzeżenie: (10%)
X----


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

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

 



RSS Aktualny czas: 5.10.2025 - 19:53