Autor Zpráva
a
Profil *
zdar je dobré takhle u GB rozdělovat dlouhá slova?

chunk_split("$text", 25, " ");

nejspíše asi né co? dělá mi to nějak neplechu :-/ jak lépe to udělat?

pak je dobré řešení takhle zaokrouhlit nahoru ?

Round($c);
$c = Floor($c+0.999999999999);
dik
Casero
Profil
a
Zaokrouhlit nahoru -> ceil()

a dlouhá slova, co třeba si rozsekat text do poli a těm pak měřit delku a v případě moc dlouhých slov rozpůlit?
a
Profil *
nojo taky sem právě ted narazil na zaokrouhlení nahoru pomocí ceil() jenže já už použil u páru věcí toco mám tak se chci zeptat jestli to je good.

no to já asi nedá dokupy to rozdělení jak tyjsi to řek zas tak zdatný nejsem :D
krteczek
Profil

$max_delka = 25;

$text = trim($text);//odstraní přebytečné mezery
$slova = explode(" ", $text); //vytvoří z textu pole kde každá položka bude jedno slovo
$p = count($slova);//zjistí počet položek v poli
for($i = 0; $i < $p; $i++)
{
if(mb_strlen($slova[$i], "utf-8") > $max_delka)
{
$slova[$i] = wordwrap($slova[$i], $max_delka, " ", 1);
}
}

krteczek
Black Wolf
Profil
Na dělení slov bych viděl jako nejlepší řešení regulární výraz, třeba něco takového:
ereg_replace('([^ ]{25})','\1 ',$text);
Jediná nevýhoda je, že pokud bude slovo stejně dlouhé jako max délka, tak za ním budou dvě mezery, ale to zas tolik nevadí vzhledem k tomu že prohlížeč zobrazí stejně jen jednu (krom toho by to šlo ošetřit dalším jednoduchým reg. výrazem).
To procházení pole které navrhuje krteczek by při dlouhém textu bylo extrémně pomalé.
krteczek
Profil
Black Wolf: Jedná se o knihu návštěv, pochybuji, že povolí víc jak 5000 znaků na zprávu, a v tom případě to je jedno, navíc v tom cyklu může jednotlivá slova kontrolovat třeba jestli to nejsou url a převádět je na odkazy atd.
krteczek
Black Wolf
Profil
krteczek: Pokud se to provede jednorázově při ukládání textu tak proč ne, pokud to ale někdo nacpe do zobrazovací části, tak to při větší návštěvnosti může způsobit problémy i u relativně krátkých textů. Samozřejmě u webíku na který vleze pět lidí denně je celkem jedno jak (ne)optimálně je to napsaný, ale když si člověk jendou zvykne používat pomalý konstrukce...;) Na převod url na odkazy bych taky viděl jako lepší řešení regulární výraz.
krteczek
Profil
Black Wolf: Já to tam nenapsal, ale takhle jsem to myslel, při ukládání se zkontroluje vše potřebné a provedou se všechny výpočetně náročné operace, takže veškeré převody atd. Výpis je potom jen o vypsání obsahu, takže rychlý a nezatěžuje server.
krteczek
a
Profil *
zdar jsem tu zas :D dal jsem to rozdělení slov při zapisování do DB a chci se zeptat jak udělat aby s emi ty ulrp řevedly na link?

a jak uědlám to omezení počtu znaků na zprávu? když to protáhnu přez todle
$pocet_znaku = count($text);
a dám při zápisu podmínku méně třeba než těch 5000

takhle seto dělá?

dík
krteczek
Profil
if(mb_strlen($text, "utf-8") > MaxDelkaZpravy){echo 'zprava je prilis dlouha';}//uprav si to dle svých potreb :-)))
D1ce
Profil
To all:

O tomhle nikdo neslyšel? wordwrap();

a

Do formuláře bych dal upozornění ve stylu: "Příspšvek delší než <?php echo MAX_DELKA_ZPRAVY; ?> bude automaticky zkrácen."

a do kódu:

define('MAX_DELKA_ZPRAVY', 5000);

$text = substr($text, 0, MAX_DELKA_ZPRAVY);

a basta fidli.
zdenek
Profil *
Na převod textu, na odkazy a zároveň na zkracování dlouhých slov i odkazů jsem si udělal regulární výraz. Celé znění dlouhého slova se objeví po najetí myši nad slovo. Funkce Wordwrap() se mi neosvědčila, protože každý znak je jinak široký a je velký rozdíl mezi 50 "i" a 50 "w" na řádku.

<?
$text = "vstupní text";

$text = preg_replace('~(http://|ftp://|(www.))([w]+([.-][w]+)*.w{2,4}(?:/ |)(?:[^,. ][^s]*[^,. ])?)|(S{41,})~e','(strlen("$5") >= 41 ?"<span title="$5">".(substr("$5", 0, 40))."...</span>" : "<a href="".("$1"=="www."?"http://":"$1")."$2$3" title="".("$1"=="www."?"http://":"$1")."$2$3">".((strlen("$1$3")>=41)? (substr("$1$3",0,40)."..."):"$1$3")."</a>")',$text);

echo $text;
?>
zdenek
Profil *
Ještě dodatek: v části reg. výrazu [w]+)*.w{2,4}(?:/|)(?:[^,. ] se mi objevil čtvereček místo "b"
krteczek
Profil
D1ce: znám, ale mám výhrady, protože v tomhle použití co navrhuješ rozdělí celý text na na každé x pozici mezerou, proto jsem navrhnoval pole a rozdělení jen těch dlouhých slov
a právě funkcí wordwrap
krteczek
krteczek
Profil
Teď jsem přišel na to že ty regulární výrazy pro převod nefungují správně určitě v utf-8 a dost možná v žádné multibyte znakové sadě :-(
krteczek
D1ce
Profil
krteczek
Manulál (modifíkátory):

u (PCRE_UTF8)

This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32. UTF-8 validity of the pattern is checked since PHP 4.3.5.

http://cz.php.net/manual/en/reference.pcre.pattern.modifiers.php
D1ce
Profil
Update
wordwrap se fakticky chová nějak divně. Doporučil bych proto tento kód:

/**
* Prvni cislo v prvnim argumentu znamena po kolika znacich se bude zalamovat({50})
* druhy argument sestava z referenece na prvni vyraz kompletne(\0) a
* ze znaku, ktery bude zalamovat celistvy text( {ta mezera}), pokud budete chtit
* new line, druhy argument nahradte timto - "\\0\n" i s dvoitymy uvozovkami
*/
preg_replace('/[^ ]{50}/', '\0 ', $text_prispevku);
krteczek
Profil
smazáno
nofate
Profil
Nic proti, ale niekto tu kritizoval krteczek-a ze jeho sposob ( :Zasláno: 24.12.2006 14:14:41 ) by bol moc zdlouhavy pri mnoha slovach. Jenze opak je pravdou. Regularni vyrazy jsou moc silne ale na ukor rychlosti, preto ich treba pouzivat iba vtedy, ak je to nevyhnutne a neda sa dana vec urobit inym sposobom.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0