Emotikony
2010-11-16 15:07:23
Post #1
programista
musimy mieć plik *.txt z "emotkami", np.: emots.txt:
1
2
3
4

||usmiech.png

||smutek.png
<lol2>||lol.png

||buzi.png
Każda emotka jest w nowej linii w formacie:
użycie||obrazek
w mojej funkcji obrazki emotek znajdują się w katalogu `emoticons`
Przykład użycia:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function emoticons($msg)
{
$emoticons = explode("\n", file_get_contents('emots.txt'));
foreach ($emoticons as $emoticon)
{
$emot = explode("||", $emoticon);
if (file_exists('emoticons/'.$emot[1]))
$msg = str_replace($emot[0], 'emoticons/'.$emot[1].'" alt="'.$emot[0].'" title="'.$emot[0].'" style="vertical-align: middle;" />', $msg);
}
return $msg;
}
$tekst = 'Liczę na jakąś krytykę ze strony autora tej strony
';
echo emoticons($tekst);
2010-11-16 18:35:28
Post #2
nospor
1)To
$emoticons = explode("\n", file_get_contents('emots.txt'));
można zastąpić przy pomocy file() - krócej
2)
1
2
3
4
5
6
7
<?php
echo emoticons('blabla');
echo emoticons('blabla2');
echo emoticons('blabla3');
echo emoticons('blabla4');
echo emoticons('blabla5');
?>
Wiesz co zrobi ten skrypt? Ten skrypt pięc razy będzie otwierał i obrabiał zawartość pliku emots.txt, ciut nie optymalnie, niesądzisz?
Poprawę tej sytuacji pozostawiam Tobie. Jakbyś jednak sobie nie radził to ci podpowiem
2010-11-16 19:27:19
Post #3
programista
Racja, rzeczywiście. file() zwraca zawartość pliku jako tablice.
1
2
3
4
5
6
7
8
9
10
11
12
function emoticons($msg)
{
$emoticons = file('emots.txt');
foreach ($emoticons as $emoticon)
{
$emot = explode("||", $emoticon);
if (file_exists('emoticons/'.$emot[1]))
$msg = str_replace($emot[0], 'emoticons/'.$emot[1].'" alt="'.$emot[0].'" title="'.$emot[0].'" style="vertical-align: middle;" />', $msg);
}
return $msg;
}
Zastanawia mnie, dlaczego użyłeś tej funkcji aż pięć razy skoro z góry jest założone, że będzie użyta raz... oczekuję Twojego lepszego rozwiązania lub innych sugestii. Idąc Twoim tokiem myślenia można
1
$emoticons = file('emots.txt');
dać przed funkcję, a w funkcji na początku można dać
2010-11-16 19:32:24
Post #4
nospor
Zastanawia mnie, dlaczego użyłeś tej funkcji aż pięć razy skoro z góry jest założone, że będzie użyta raz...
Hmmm, a skąd tak dziwne założenie?
Co do wskazówki: użyj zmiennej statycznej w funkcji (STATIC). I w funkcji sprawdzaj czy już była ta zmienna wyliczona czy nie. Jak tak to ją wyliczasz, jak nie to nie
Poza tym nie potrzebnie używasz foreach. Powinienes przygotować dwie tablice: co zamienic, na co zamienić, a potem do str_replace przekazywać te tablice - o wiele szybciej. Wówczas też byś miał większy porzytek ze STATIC gdybyś też założył go na te przygotowane tablice.
2010-11-16 19:50:14
Post #5
programista
W ogóle powinno być w str_replace na początku jeszcze "<img src="" bo mi ucięło
1
$msg = str_replace($emot[0], '<img src="emoticons/'.$emot[1].'" alt="'.$emot[0].'" title="'.$emot[0].'" style="vertical-align: middle;" />', $msg);
Co do rozwiązania z tablicami to pewnie ciekawe rozwiązanie, ale tutaj mam możliwość sprawdzenia przed zamianą czy w rzeczywistości ten plik obrazka istnieje... i tak nie rozumiem w czym tutaj może Ci pomóc static w funkcji. Przekonaj mnie do takiego rozwiązania.
2010-11-16 19:58:50
Post #6
nospor
ale tutaj mam możliwość sprawdzenia przed zamianą czy w rzeczywistości ten plik obrazka istnieje...
Jakoś strasznie lubisz wychodzić z jakimiś dziwnymi założeniami
Skad pomysł, ze przy tablicach nie możesz?
i tak nie rozumiem w czym tutaj może Ci pomóc static w funkcji. Przekonaj mnie do takiego rozwiązania.
Ile płacisz za robienie ci dobrze?

Powiedziałem: dzięki static unikniesz niepotrzebnemu wielokrotnemu robienia tego samego. Jeśli to Cię nie przekonuje to naprawdę bardziej już się wysilać nie będę
2010-11-16 20:03:54
Post #7
programista
jak to powiedział mój kumpel komuś - "za lody się nie płaci"
Przekonywuje mnie to jednak nie mam pomysły na to rozwiązanie

poddaje się

Ty masz większe doświadczenie, więc oczekuję pomocy
2010-11-16 20:07:10
Post #8
nospor
Kod przykładowy:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function test(){
static $zm=null;
if (empty($zm)){
echo 'to sie wykona tylko raz';
$zm = 'cos';
}
echo 'A to się wykona tyle razy ile funkcja zostanie wywołana';
}
test();
test();
test();
?>
Odpal sobie ten kod, zobacz co robi, a potem przeanalizuj i dostosuj do siebie.
2010-11-16 20:10:24
Post #9
programista
a teraz pokaż rozwiązanie z dwiema tablicami
2010-11-16 20:13:06
Post #10
nospor
No jedna tablica ma zawierać co zamieniasz, a druga na co zamieniasz. Tworzysz je w petli na podstawie danych z pliku.
2010-11-16 20:13:40
Post #11
nospor
A tu masz napisane jak uzywac tych tablic:
http://pl.php.net/manual/pl/function.str-replace.php
2010-11-16 20:17:38
Post #12
programista
myślałem, że masz rozwiązanie bez pętli bo narzekałeś na nie

tak to wiem jak to działa

dzięki za ocenę i zdanie
2010-11-16 20:21:26
Post #13
nospor
myślałem, że masz rozwiązanie bez pętli bo narzekałeś
Bo ty w petli wykonujesz str_replace. To nie jest najlepsze rozwiązanie. Lepiej przygotowac tablice i raz zapodać to do str_replace.
2010-11-19 19:27:40
Post #14
korey
Skoro mamy już taki temat to pozwolę sobie zaprezentować swoja Funkcję:
Działa ona jak dla mnie dobrze i w miarę optymalnie. pisząc ją opierałem się na wzorcach innych programistów. jest ona dostosowana od razu do bbCode.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
function bbCode($tekst){
$string = array(
array(':p', '
', ';p', ';P', ':-P', ';-P', ':-p', ';-p' ), array('
', '=)', ':]' ), array('
', ';]', ';>', ':pp', ';pp' ), array('
(', ';((', 'x(', ';[', ';[' ), array('
', ';(', '=(', ':[', ';[' ), array(":'(", ";'(" ), array('
', ';*', '
*', ';**', ':-*', ';-*', '=*'), array('xd', 'Xd', 'xD', '=d', '=D', ':d', '
', ';d', ';D' ), array("=/", ":/ ", ";/", ";//", ":// ", ":|", ";|"), array('[sex]') );
$obrazki = array(
'jezyk.gif',
'usmiech.gif',
'wesoly.gif',
'smutny.gif',
'smutny2.gif',
'placze.gif',
'buziak.gif',
'zeby.gif',
'zniesmaczony.gif',
'sex.gif'
);
foreach ( $string as $key => $val )
{
$tekst = str_replace($val, '[img]'layout/obrazki/emots/' . $obrazki[$key].'[/img]', $tekst);
// ALBO
/*
$tekst = str_replace($val, '[img]http:*/
}
echo ($tekst);
}
?>
Link do pobrania obrazków:
http://www.megaupload.com/?d=1V5B8GT6
Demko:
http://get-movie.pl/art/index.php?artykuly=Emotikons
Dla zainteresowanych dodam toolbar z przyciskami do bbCode
2010-11-19 19:36:36
Post #15
nospor
No i ten sam problem co u kolegi wcześniej: str_replace w pętli.
No ale ogólnie ok
edit: ale widzę, że ty działasz na tablicy dwuwymiarowej. Robiłeś może testy porównacze co lepiej zrobic: tak jak ty, czy może jednak tablica jednowymiarowa i str_replace bez petli?
2010-11-19 19:41:04
Post #16
korey
No ale Co jest złego w tym ze jest to w pętli..?
2010-11-19 19:45:19
Post #17
nospor
Zrób test, zmierz czasy z i bez a się dowiesz
2010-11-19 19:47:13
Post #18
korey
no ale jak zmierzyć..? bo nie rozumiem..?
PS jak zrobić opcję "podgląd"..?
2010-11-19 19:48:32
Post #19
nospor
1) Jak zmierzyc? Normalnie, mierzysz czas przed rozpoczeciem, mierzysz czas po zakonczeniu i odejmujesz jedno od drugiego.
2) Podgląd czego?
edit: tu masz przyklad
http://pl2.php.net/manual/pl/function.microtime.php
2010-11-19 19:53:17
Post #20
nospor
ad1) ajax
ad2) no masz w manualu. Przekazujesz do str_replace tablice
http://pl.php.net/manual/pl/function.str-replace.php
Przejrzyj przykłady
Odpowiedz