Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: emoty - usuwanie duplikatów + wyrażenia regularne
Forum PHP.pl > Forum > PHP
zombie
[php:1:4eb40e2aba]<?php
function wstawemota($linia){
preg_match_all ("|[.*?]|", $linia, $emt);
$emt[0] = array_unique($emt[0]);
foreach($emt[0] AS $key => $val){
$emot = (ereg_replace("]|[","",$val));
if (file_exists("emots/".$emot.".gif"))
{
$linia = str_replace($val, "<img src="emots/".$emot.".gif" title="".$emot."">", $linia);
}
}
return $linia;
}
?>[/php:1:4eb40e2aba]

... w skrótcie tak wygląda funkcja odpowiadająca za emoty. Problem polega na tym, że chcę wykluczyć duplikaty, tj. żeby zamiast smile.gifsmile.gifsmile.gif pojawiało się smile.gif Poza tym nie najpewniej czuję się w wyrażeniach regularnych, więc jeśli można to zrobic prościej, będę wdzięczny za wskazówki.

Z góry dzięki za pomoc.
hwao
Ja nie znam sie za dobrze w wyrazeniach wiec napisze pomysl winksmiley.jpg

Trzeba by zrobic wyrazenie ktore sprawdza czy po usmieszku nie wystepuej znaki typu spacja(lub bez spacji i odrazu) : ; bo od nich zaczyna sie wiekszosc emontkow i tamtej resty nie zamienial tylko ten 1
zombie
hmm... właściwie kilka emotków może następować po sobie. bardziej chodzi o to, żeby kilka tych samych nie powtarzało się po kolei.
BzikOS
Możesz rzucić przykładowym stringiem zawierającym emoty, w tym kilka tych samych następujących po sobie i kilka różnych następujących po sobie. Pokombinuję w wolnym czasie.
zombie
Cytat
jakiś text [heee][heee] la la la smile.gifsmile.gifsmile.gif [wesoly][czad][skacze]


... dzieki smile.gif
BzikOS
[php:1:87de64d7fb]<?php
$str = "jakiś text [heee][heee] la la la smile.gif smile.gif [wesoly][czad][skacze]";

$str = preg_replace( "/([.*?])+1/s", '1', $str );
$str = preg_replace_callback( "/[(.*?)]/s", 'repl', $str );

print($str);

function repl($match)
{
if( file_exists( "emots/" . $match[1] . ".gif") )
{
return( "<img src="emots/" . $match[1] . ".gif" title="" . $match[1] . "">" );
}
else
{
return False;
}
}
?>[/php:1:87de64d7fb]

Niestety w 2 pregach :/
Da się zrobić na jednym, ale narazie tyle wykombinowałem, jeżeli Ci to odpowiada to spox, a jeśli nie to mów, będe kombinował dalej ale później, bo narazie w robocie siedzę.
zombie
dzięki BzikOS... chyba trzeb pokombinować w innym kierunku... sam nie wiem... Twój kod jest ok, ale przestaje spełniać zadanie, kiedy string wygląda np. tak:
Cytat
jakiś text [heee] [heee] la la la [wesoly][czad][skacze]
Czyli następujące po sobie emoty są oddzielone spacją... Może założyć, w preg_replace, że między nimi może wystąpić pojedynczy znak...
BzikOS
[php:1:12a0ccb35a]<?php
$str = preg_replace( "/([.*?])+[s]{0,}1/s", '1', $str );
?>[/php:1:12a0ccb35a]

Podmień.
zombie
Dzięki serdeczne! Muszę się poważnie zabrać za wyr. nieregularne, coś mi się zdaje. :)

P.S.: Czy wiesz może jak do składni preg_replace wprowadzić zmienne? To samo co z tymi emotami chcę zrobić z ':)' <- dane o nich mam w array()

[php:1:b1122a65b6]<?php
$emotsARRAY = array(";(","cry",":D","lol",":(","sad",":o(","sad",":-(","sad",":-)","smile",":o)","smile",":)","smile",":|","wrong","=)","smile3",":p","tongue",";p","tongue",":P","tongue",";)","wink");
?>[/php:1:b1122a65b6]
BzikOS
[php:1:46b323d327]<?php
foreach( $emotsARRAY as $aVal )
{
$aVal = str_replace( Array('(', ')', '|'), Array('(', ')', '|'), $aVal );
$str = preg_replace( "/($aVal)+s?1{1,}/s", '1', $str );
}
?>[/php:1:46b323d327]

Coś takiego?
FiDO
Lepiej uzyc preg_quote:
[php:1:24c9cf3423]<?php
foreach( $emotsARRAY as $aVal )
{
$aVal = preg_quote($aVal, "/");
$str = preg_replace( "/($aVal)+s?1{1,}/s", '1', $str );
}
?>[/php:1:24c9cf3423]
zombie
ok. dzięki. myślę, że dam już sobie z tym radę smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.