2010-11-16 15:07:23 Post #1 programista

 
musimy mieć plik *.txt z "emotkami", np.: emots.txt:
||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:
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)
<?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.

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
$emoticons = file('emots.txt');
dać przed funkcję, a w funkcji na początku można dać
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
$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:
<?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.
<?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

Odpowiedz

1 2 >

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer