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ć
1
global $emoticons;

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' ), // jezyk.gif 
   
array('''=)'':]' ), // usmiech.gif
   
array(''';]'';>'':pp'';pp' ), // wesoly.gif
   
array('('';((''x('';['';[' ), // smutny.gif
   
array(''';(''=('':['';[' ), // smutny2.gif
   
array(":'("";'(" ), // placze.gif
   
array(''';*''*'';**'':-*'';-*''=*'), // buziak.gif
   
array('xd''Xd''xD''=d''=D'':d'''';d'';D' ), // zeby.gif
   
array("=/"":/ "";/"";//"":// "":|"";|"), // zniesmaczony.gif
   
array('[sex]'// zniesmaczony.gif
   
);
  
   
$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://'.$_SERVER['HTTP_HOST'].'/layout/obrazki/emots/' . $obrazki[$key].'[/img]', $tekst);
*/
  }
// Ciąg dalszy kodu nie jest wymagany
// ponizej znajduje się zamiana tekstu na bbCode
/*
    // BB Code Start
    $tekst = nl2br($tekst);
//    $tekst = str_ireplace("[]",'<b>\\1</b>',$tekst); // ikona sex
    $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst); // Pogrubienie
    $tekst = preg_replace("#\[i\](.*?)\[/i\]#si",'<i>\\1</i>',$tekst); // Kursywa
    $tekst = preg_replace("#\[u\](.*?)\[/u\]#si",'<u>\\1</u>',$tekst); // Podkreślenie
    $tekst = preg_replace("#\[s\](.*?)\[/s\]#si",'<s>\\1</s>',$tekst); // Skreślenie
    $tekst = preg_replace("#\[center\](.*?)\[/center\]#si", '<center>\\1</center>', $tekst); // Wycentrowanie
    $tekst = preg_replace("#\[img\](.*?)\[/img\]#si",'<img src="\\1" alt="\\1" />',$tekst); // Wstawianie obrazków bez tekstu alternatywnego
    $tekst = preg_replace("#\[img=(.*?)\](.*?)\[/img\]#si",'<img src="\\1" alt="\\2" />',$tekst); // Wstawianie obrazków z tekstem alternatywnym
    $tekst = preg_replace("#\[url\](http.*?)\[/url\]#si", "<A HREF=\"\\1\" TARGET=\"_BLANK\" class=\"art\">\\1</A>", $tekst); // Odnośnik www - nie dodaje http
    $tekst = preg_replace("#\[url=(http.*?)\](.*?)\[/url\]#si", "<A HREF=\"\\1\" TARGET=\"_blank\" class=\"art\">\\2</A>", $tekst); // Odnośnik www z opisem - nie dodaje http
    $tekst = preg_replace("#\[color=(.*?)](.*?)\[/color]#si", "<span style=\"color:\\1\">\\2</span>", $tekst); // Kolor tekstu
    $tekst = preg_replace("#\[size=(.*?)](.*?)\[/size]#si", "<span style=\"font-size:\\1px;\">\\2</span>", $tekst); // Rozmiar czcionki
    $tekst = preg_replace("#\[list\](.*?)\[/list\]#si", "<ul><li class=\"art\">\\1</li></ul>", $tekst); // Lista
    $tekst = preg_replace("#\[hr\]#si", "<hr style=\"color: #D7D7D1; width: 80%;\">", $tekst); // Pozioma linia

*/
    
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
1 2 >

Odpowiedz