21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
peta
Profil *
Nemate nekdo regularni vyraz pro zpravu se smajliky?
Kokretne mam ve smajlikach tyto znaky:
8>@-:])(;
a nechci, aby mi je tento regularni vyraz odfiltroval

!Ereg("^[^&<>\"]*$",$sprava) ||
(jestlize nevyhovuje vyrazu...)

a nenasel jsem nejaky pekny seznam na vysvetleni, jak tam zapsat hranate zavorky a spol.

A jak je to pak bezpecne? Nemuze mi nekdo ukoncit script ?> nebo podminku a dopsat si tam list -la, pripadne delete *.*? :)
WertriK
Profil *
$sprava = HTMLSpecialChars($sprava); // aby ti to nikdo nemohl ukoncit, nebo psat treba </td></tr> aby ti zmrsil stranky

Proč si to neuděláš prostým nahrazováním(?):

$sprava = Str_Replace(":]", "<img src=\"smile1.gif\">", $sprava);
$sprava = Str_Replace(":)", "<img src=\"smile2.gif\">", $sprava);
...
peta
Profil *
WertriK: To tak mam :)
Ale tak nejdriv treba ze zpravy odfiltrovat vsechny nesmajlikove znaky a pak tam treba dat smajliky a zrusit ostatni znacky. Nebo tak ruzne v poradi.

ten script vypada takto, s tim, ze to neni jeste upraveny, jenom demo

$smajly = array ('8>','@->-',':>',':P',']:>',':)))','B)',':)');
$replace = array ();
for ($i=0;$i<8;$i++) $replace[$smajly[$i]]='<u class="s ml'.$i.'" title="'.$smajly[$i].'">&nbsp;</u>';

reset($replace); // nastavit na začátek
while(list($key,$val) = each($replace)) $sprava = str_replace($key,$val,$sprava);
peta
Profil *
Jenomze kdyz ve zprave nebude neco jako smajlik, tak mi to tam ponecha...

tato funkce "HTMLSpecialChars" mi odfiltruje vse, co jsou html tagy? Nebo to prida jen lomitka nebo si to pletu s jinou?
peta
Profil *
Hm, tak jsem to nasel
http://cz.php.net/htmlspecialchars
Jenze ja chci vytahnout nejdrive ty smajliky nez mi to zrusi cely text. A opacne, kdyz to udelam, tak mi to zas spany pro smajliky prepise na &lt; &gt; ...
peta
Profil *
WertriK Tys zrejme uvazoval smajliky jako !cislo, ale ja chci normalni textove konvertovat :)
WertriK
Profil *
tak fcil jsi mi zamiškoval celý zivot, vůbec nevím co cheš....

když ti ta fce "HTMLSpecialChars" přepíše smajlíky na &lt; atd. tak si to zase zkonvertuj zpátky:
například máš smajlíka :>
po HTMLSpecialChars to bude ":&lt;" tak napiš

$sprava = Str_Replace(":&lt;", ":>", $sprava);

btw co myslíš tím textově konvertovat?
napiš srozumitelně co chceš já to udělám(nebo se pokusím), ale takto opravdu netuším co potřebuješ...
peta
Profil *
Uz nemusis, udelam to jinak :)
Chci zkonvertovat textovy smajlik na span (nebo ty pouzivat img).

Zkratka to udelam na 2x
text ... necham projit replace smajlik ":)" na *1*
tex2 ... pustim to htmlspecialchar a odfiltruji ostatni divne znaky :)
text3 ... prevedu smajliky replacakem z *1* na <span class="sm l1">&nbsp;</span> (s tou mezerou, protoze mam tridu sm (s background-image) a tridy l1,l2,l3... (s backgroun-position) )

Pozn.:
Ano, ja vim, proti img je ten span kodove neusporny, ale zas takto mam smajliky v jednom obrazku a nacita se mi jen 4k soubor najednou pro 24 sml :) Coz mi teda vyhovuje vice nez 24x100byte a pri kazdem smajliku by to tahalo ze serveru... Ano, pomoci JS lze udelat preload image, ale to je tak podobne velky jako ten zapis v css a bez js to pojede take. Ano, prijdu tak o animovany gif, ale to mi nevadi.
WertriK
Profil *
Zkratka to udelam na 2x
text ... necham projit replace smajlik ":)" na *1*
tex2 ... pustim to htmlspecialchar a odfiltruji ostatni divne znaky :)
text3 ... prevedu smajliky replacakem z *1* na <span class="sm l1">&nbsp;</span> (s tou mezerou, protoze mam tridu sm (s background-image) a tridy l1,l2,l3... (s backgroun-position) )

co tak to udelat :
tex2 ... pustim to htmlspecialchar a odfiltruji ostatni divne znaky :)
text3 ... prevedu smajliky replacakem z :&lt; na <span class="sm l1">&nbsp;</span> (s tou mezerou, protoze mam tridu sm (s background-image) a tridy l1,l2,l3... (s backgroun-position) )
printf
Profil
co takhle ty smajlíky řešit až při výpisu?
WertriK
Profil *
tím by se tento problém moc nevyřešil, zapsal by se jako :&lt; (po použití htmlspecialchar) a při výpisu by se stejně muselo replacovat z :&lt; na <span class="sm l1">&nbsp;</span> => doporucuji prvně použít htmlspecialchar zjistit (třeba v frontpage) jak se budou znaky měnit (z > na &lt;) a potom replacovat(ale celé smajlíky né jen &lt; na > to by ten specialchar moc nepomohl ....
printf
Profil
to přece nevadí replacovat místo :&lt; :<, myslím že fci replace je to úplně jedno, uspoří se trocha místa a nebude problém v budoucnu nahradit span za img či za cokoliv jiného. Možná by to zdržovalo výpis ale snad jen nepatrně.
peta
Profil *
printf: Pri vypisu je to nesmysl. Smajliky treba resit pri zapisu do souboru. Pak to nezdrzuje zobrazovani uzivatelum.

WertriK: nene, tvuj zpusob je nepouzitelny :) Zbytecne bych si pridal kodu. Sem se rozhodl, ze klikaci smajliky udelam pres hvezdicky, textove se zkonvertuji. To je asi nej reseni.
Takze prvni filtr se pokusi prevest textove na hvezdickove :) -> *1* (a pri tom veme i :) ;) :-) ;-) :o) ;o) )
Takze ten treti to bude mit pak jednodussi (prevede pevne hvezdickove a ty muze mit uz podle cisla serazene a script bude podobny, jak jsem nahore vypsal, jestli jsem vypsal).
Druhy vyfiltruje ty special char.
Zkratka, jak jsem to psal, jen jsem to promyslel pres noc :)

printf: Ten SPAN jsem nakonec hodil na U /U , protoze mam tam i klikaci pres A /A a to dam jednotny css .sm {text-decoration:none} IMG tam zatim davat nebudu, budu mit pevnou sadu smajliku a ono to strasne zdrzuje, kdyz se nacita IMG po jednom. Tuhle vymozenost a animaci smajliku si muze fakt dovolit jenom xko.cz :) Ano, da se udelat pres JS preload imagu (var img0=new image();img0.src;), ale to je taky druh kodu dost sporny na rychlost...
peta
Profil *
tu funkci mam ted takovou, jenom bych chtel poradit se zapsanim premeny textovych na ciselne. Zkratka ten regularni vyraz. Fintu s tim pluskem mam z root.cz
http://www.root.cz/clanky/regularni-vyrazy-v-php-funkce/

// --- smajlici ---
// convert text-smile to *num*
//$smajly0 = array (
//'O:\-\)','>:\-\)',':\-|',':\-\)=',
//':\-\)\)+',':o\)\)+',':\)\)+',
//':\-\(\(+',':o\(\(+',':\(\(+',
//':\-\)+',':o\)+',':\)+',
//':\-\(+',':o\(+',':\(+',
//'@\->\-','=^\-^=','<3','*^_^*',':\-*','o^o','=:@\)');
//$smajly1 = array (14,15,16,17, 0,0,0,3,3,3,1,1,1,2,2,2, 4,7,10,12,13,20,21);
//for($i=0;$i<16;$i++)
//$sprava = Ereg_Replace($smajly0[$i],
// '*'.$smajly1[$i].'*' ,
//$sprava);

// other chars to entites
$sprava = HTMLSpecialChars($sprava);

// convert *num* to pic-smile
for ($i=0;$i<24;$i++)
$sprava = str_replace('*'.$i.'*','<u class="sm l'.$i.'" title="'.$i.'">&nbsp;</u>',$sprava);

Stranka, kde je to v provozu:
http://peter-mlich.wz.cz/xx/
printf
Profil
peta
ok, no pokud to má jen generovat kus HTML kódu, pak to samozřejmě stačí přeložit jednou. Měl jsem na mysli pokročilejší systém, kde by bylo možno si příspěvky pohodlně číst i přímo ze souboru třeba v notepadu nebo je třeba dodatečně upravovat ale to není to co se tu řeší :-))
peta
Profil *
printf: Mi to moc pokrocilejsi neprijde, kdyz se to musi pokazde generovat. To je zdrzovacka, zbytecna zatez serveru. Pokud to chces editovat notepadem, pust si zpetny prevod :) To mi prijde daleko pokrocilejsi nez zatezovat servera neustalymi pozadavky o prevod 100 radku na smajliky, rekneme pro 50 lidi online. Jako ten chat mam jen jako hracku, tam bude tak 1-2 lide :)
Hele, ukaz webku, at vim, jak premyslis? Jestli to neni jen streleni od boku s tim chatem nebo tak premyslis stale a mas i takovou webku, plus stejnou validitu? :)
peta
Profil *
printf: Nemusis davat webku, jakousi jsem objevil v tvem clenstvi. Aspon je temer validni, az na mapy do Dukena, kde mas & ktery neni jako &amp; . Zajimave obory tam mas :)
K tomu chatu a prevodu. Pro kazdeho uzivatele by se pri refresh konvertovali vsechny zpravy, ale pro editaci by to bylo rychle. Opacny postup je podle mne vyhodnejsi. Nebo jsem teda nepochopil tvuj pokrocilejsi system... Editovat zpravu u chatu uz jednou odeslanou? Nesmysl, ne? Tohle tak leda u fora a i tak je vyhodnejsi vygenerovat kod.
printf
Profil
peta
Jo, ten web pravda není moc udržovanej, některé stránky jsou z doby, kdy mi validita moc neříkala a už se mi je nechtělo předělávat.

Obávám se že s tím vypisováním si stále nerozumíme. Kdybych měl redakční systém (či diskusní fórum) s několika sty návštěv denně, tak bych asi každou stránku při změně generoval do souboru (či db), který bych pak přímo posílal návštěvám, čili zátěž nejmenší jaká může být. K tomu bych měl ale také všechny texty (s nějakými formátovacími značkami jako styl písma, obrázky atd... a s normálními smajlíky) pro potřeby pozdějších úprav. V tom vidím tu pokročilost.

Doufám že jsem se vyjádřil jasně, pro jistotu ještě dodám že u chatu kde se dodatečně nic upravovat nebude bych to replacování taky dělal jen jednou.
peta
Profil *
printf: Jo, tak nejak jsem to pochopil. Az na to, ze mas vse ulozene 2x. Ale to je vyhoda pro tvuj pripad.

Ted jeste, kdybys mi poradil, jak spravne zapsat ty smajliky, nevim, ktere znacky regularni vyrazy berou jako znaky a ktere jako funkce?
$smajly0 = array (
???
'O:\-\)','>:\-\)',':\-|',':\-\)=',

tyhle jsou original, ty by meli byt oki
':\-\)\)+',':o\)\)+',':\)\)+',
':\-\(\(+',':o\(\(+',':\(\(+',
':\-\)+',':o\)+',':\)+',
':\-\(+',':o\(+',':\(+',

???
'@\->\-','=^\-^=','<3','*^_^*',':\-*','o^o','=:@\)');

$smajly1 = array (14,15,16,17, 0,0,0,3,3,3,1,1,1,2,2,2, 4,7,10,12,13,20,21);
for($i=0;$i<16;$i++)
$sprava = Ereg_Replace($smajly0[$i], '*'.$smajly1[$i].'*' , $sprava);

... vertika jsem asi omrzel s mojimi neustalymi zmatenymi a hloupymi dotazy :)
peta
Profil *
dam jeste original, bez tech lomitek, co jsem se pokousel ja...
'O:-)',
'>:-)',
':-|',
':-)=',

'@->-',
'=^-^=',
'<3',
'*^_^*',
':-*',
'o^o',
'=:@)'
);
WertriK
Profil *
heh me si neomrzel, me prestal fungovat net :)
btw a v tomto se uz ztracim....
printf
Profil
s regulárníma výrazama zas moc zkušeností nemám, navíc tohle bych řešil normálně přes StrTr (regulární výrazy taky dost zatěžujou). Smajlíky bych nahradil těma spanama či podobně a samotné značky < > a podobně které nejsou součástí smajlíka nahradil entitama:

$Trans = Array (":-)" => "<img ...nebo cokoliv jineho>", "\"" => "&quot;", "'" => "'", "<" => "&lt;", ">" => "&gt;","\n" => "<br>",atd...);
$vystup = StrTr ($vstup, $Trans);
peta
Profil *
WertriK :) V cem se ztracis. Problem je stale stejny, nahradit textove smajliky za neco jine. Jenom ja si dal ty smajliky primo do pole, ktere obsahuje smajlik prepsany do regularniho vyrazu.

Cili:
':\-\)\)+',':o\)\)+',':\)\)+',
':\-\(\(+',':o\(\(+',':\(\(+',
':\-\)+',':o\)+',':\)+',
':\-\(+',':o\(+',':\(+',
prvni sloupec je vyraz pro smajliky:
' :-)) ' a ' :-) ' a ' :-( ' a ' :(( ' To plusko tam znamena jen, ze to muze byt :-))))))
druhy sloupec je totez s kulatym nosikem "o" a treti bez nosiku.
Ty ostatni jsou prave smajliky kocicky, kyticky, tresnicek,...

Mno, tak nic, pobadam sam, jen se mi nechtelo :) Predpokladam, ze mam prave chybu v nekterem zapisu, proto to tak zlobi, ze jsem to radeji zakomentoval.

printf: entity nepouzivat :) Tim bych nic neusetril, entitama je to trapne. Ale rikas, ze by se to zpracovalo rychleji? Ja si nevsiml, ze by to bylo nejak pomalejsi, kdyz jsem tam mel str_replace,treba. Nebo jsem tam mel myslim i regulerni vyraz, nevim. A to je na wz.cz . Sem se prave koukal, jak krasne to stiha. Sem cekal, ze na wz.cz bude ten chat i pro jednoho skubane, jak jsou htmka.
Anonymní
Profil *
entity nepouzivat :)
proč?
peta
Profil *
Anonymní moc kodu :)

Nakonec jsem to poresil takto:
// --- smajlici PHP ---
// convert text-smile to *num*
$smajly0 = array (
':\-\)\)+|:o\)\)+|:\)\)+',
':\-\(\(+|:o\(\(+|:\(\(+',
':\-\)|:o\)|:\)',
':\-\(|:o\(|:\('
);
$smajly1 = array (0,3,1,2);
for($i=0;$i<4;$i++)
$sprava = Ereg_Replace($smajly0[$i], '*'.$smajly1[$i].'*' , $sprava);


// other chars to entites
$sprava = HTMLSpecialChars($sprava);

// convert *num* to pic-smile
$smilepopis = array (
':-)) :o)) :))', ':-) :o) :)', ':-( :o( :(', ':-(( :o(( :((',
'@->-', '@->-', 'tanec', '=^-^=',
'beruska', '<3', '<3', '<3',
'*^_^*', ':*', 'O:)', '>:)',
':|', ':)=', 'vlocka', 'slunicko',
'o^o', '=:@)', 'koste', 'tapka pa'
);

for ($i=0;$i<24;$i++)
$sprava = str_replace('*'.$i.'*','<u class="sm l'.$i.'" title="'.$i.' '.$smilepopis[$i].'">&nbsp;</u>',$sprava);

A pekna webka na regularni vyrazy je:
http://interval.cz/clanek.asp?article=3758
Anonymní
Profil *
ještě ke všemu cyklus for, a pak že to má bejt co nejrychlejší :-)))
peta
Profil *
Anonymní: Tak porad neco rychlejsi?
Mi to prijde, ze for je dostatecne rychly. Nikdo nic lepsi nenabidl, zatim, ani ty :)
peta
Profil *
Aj s tim ereg, nekdo rikal, ze regularni nejsou vhodne, a protoze ja zadny jiny neznam, tak sem pouzil prave toto.
Mi to prislo jako nej, protoze tam lze nahradit i kombinace :)))))) ( jako :))+ )
printf_jinde
Profil *
jenže to nahradí všechny :)) i :-))))))) jedním smajlíkem, tak k čemu to je. StrTr to je moje univerzální medicína :-)
Cappy
Profil
Já to řešil takhle:

*b* <b>tučný text</b> */b*<br>
*u* <u>podtr�ený text</u> */u*<br>
* i* <i>kurziva</i> */i*<br>
<a href=\"javascript:add_smile(' *1* ')\"><img src=\"smajlici/1.gif\" border=\"0\"></a>
<a href=\"javascript:add_smile(' *2* ')\"><img src=\"smajlici/2.gif\" border=\"0\"></a>
<a href=\"javascript:add_smile(' *3* ')\"><img src=\"smajlici/2.gif\" border=\"0\"></a>
a další odkazy

$nahradit_co = array("*b*","*/b*","*u*","*/u*","*i*","*/i*","*1*","*2*","*3*");

$nahradit_cim = array("<b>","</b>","<u>","</u>","<i>","</i>",
"<img src=\"smajlici/1.gif\" alt=\":-(\">","<img src=\"smajlici/2.gif\" alt=\":-(\">","<img src=\"smajlici/3.gif\" alt=\":-(\">";
Toto téma je uzamčeno. Odpověď nelze zaslat.

0