Autor Zpráva
Pavel Straka
Profil
Dobré odpoledne, chtěl bych poprosit o radu zkušenějších.

Z databáze načítám pomocí MySQL_Fetch_Assoc určitý text a chci jej, pokud je delší než 100 znaků oříznout (a přidat 3 tečky).
Problém je v tom, že text se "neořízne" po 100 znacích, ale po menším počtu. Předpokládám, že je to nějaký problém s kódováním, např. že "á", není počítáno jako jeden, ale jako více znaků.

Existuje způsob, jak se tomuto vyhnout?
Děkuji za ochotu pomoci.

if (mb_strlen(strip_tags($a["text"]),"UTF-8") > 100) $tecky = "...";
$upr_text = mb_substr(strip_tags($a["text"]),0,100).$tecky;
Alphard
Profil
Je v tom "menším počtu" nějaké pravidlo? Jak se určuje kontrolní počet, nepřehlíží se třeba nějaké bílé znaky?
Tori
Profil
U mb_substr bych raději taky definovala kódování řetězce, a použila spíš postup:
1. odstranění tagů
2. odstranění nadbytečných mezer, tabulátorů, zalomení řádku apod.
3. teď teprve oříznout na x znaků a případně doplnit výpustku.
Pavel Straka
Profil
Alphard: Žádné pravidlo jsem nevypozoroval.
Z textu: "Hlásíme první dvacítku pěkných garáží po celé ČR! Zejména přibyly pronájmy garáží v Praze, Ostravě a Ústí nad Labem." vznikne "Hlásíme první dvacítku pěkných garáží po celé" (46 znaků).

Z textu: "Tak a konečně jsme připojili k Facebooku, kde Vás budeme průběžně zpravovat o novinkách na webu, zajímavostech či žhavých nabídkách." vznikne "Tak a konečně jsme připojili k Facebooku, kde Vás budeme průběžně zpravovat o novinkác" (87 znaků).

Tori: Ani když jsem skript upravil tak, jak říkáš, nedošlo k žádné změně.
DJ Miky
Profil
Můžeš poslat ten upravený skript? Když doplníš kódování i do mb_substr, tak tvůj výše uvedený skript funguje také:

<?php
$a = array(
    'text' => 'Hlásíme první dvacítku pěkných garáží po celé ČR! Zejména přibyly pronájmy garáží v Praze, Ostravě a Ústí nad Labem.'
);

if (mb_strlen(strip_tags($a["text"]),"UTF-8") > 100) $tecky = "...";
$upr_text = mb_substr(strip_tags($a["text"]),0,100, 'UTF-8').$tecky;

echo $upr_text; // Hlásíme první dvacítku pěkných garáží po celé ČR! Zejména přibyly pronájmy garáží v Praze, Ostravě a...
echo mb_strlen($upr_text, 'UTF-8'); // 103
?>
Pavel Straka
Profil
Přišel jsem už na to, v čem je kámen úrazu. Pokud místo $a["text"] zadám např. proměnnou $text = 'Hlásíme první dvacítku pěkných garáží po celé ČR! Zejména přibyly pronájmy garáží v Praze, Ostravě a Ústí nad Labem.', funguje vše ok, tak jak píše DJ Miky.

Problém tedy bude někde při výběru z databáze, pomůže někomu tato indicie nasměrovat mě k vyřešení problému?

Děkuji.


Beru zpět, problém bude v tom, že v "textu" jsou uloženy HTML tagy. Měl jsem ale za to, že právě funkce strip_tags toto vyřeší.
Takto tedy vypadá vstupní text:
<p><strong>Hl&aacute;s&iacute;me prvn&iacute; dvac&iacute;tku pěkn&yacute;ch gar&aacute;ž&iacute; po cel&eacute; ČR! Zejm&eacute;na přibyly pron&aacute;jmy gar&aacute;ž&iacute; v Praze, Ostravě a &Uacute;st&iacute; nad Labem.</strong></p>

Je generovaný editorem TinyMCE. Jakou funkci mám ještě případně použít, abych měl jistotu, že jde o 100 "skutečných" znaků ?
Tori
Profil
Pavel Straka:
Zjistěte, co vrací funkce mb_internal_encoding. Pokud je to cokoli jiného než utf-8, je problém v nezadaném kódování u mb_substr. (U mě to takto fungovalo, výchozí kódování bylo ISO-8859-1). Pokud to není tím, zkontrolovala bych, jestli je správně nastavené kódování pro připojení k databázi, tedy jestli opravdu vrací data v utf-8.


Aha takhle. Buď před zkrácením text dekódovat, anebo ho do databáze ukládat bez entit. Osobně jsem spíš pro druhou variantu z důvodu menší závislosti dat na způsobu zobrazení, ale to je jen můj subjektivní názor.
Pavel Straka
Profil
Ano, taky by se mi líbila druhá varianta. Jak, prosím, bezpečně převedu entity na "znaky"?


Mám na mysli před uložením do databáze.
Tori
Profil
html_entity_decode
Pavel Straka
Profil
Výborně, děkuju za pomoc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: