[PHP] Regex voor smiley-script

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een script wat smiley-codes vervangt door een plaatje. Werkt allemaal perfect middels een str_replace . Alleen nu is het probleem dat ik bepaalde codes heb die hetzelfde beginnen, zoals een : p en een : puke : (zonder spaties)

Die : puke : wordt dus omgezet naar :P uke:.

Oplossing hiervoor heb ik inmiddels gevonden: Regex, die moet dus controleren of er een spatie voor en na staat of dat de smiley aan het begin/eind van een regel staat.

Ik ben tot het volgende gekomen, maar regex is een redelijk grijs gebied voor me, dus een duwtje in de goede richting zou welkom zijn ;)

code:
1
2
3
4
if (eregi("^[:space:][:;(-][[:punct:]a-z0-9_]+[:)]?[:space:]$", $str) ) 
        { 
        ' doe tekst vervangen voor smiley 
}


maar hij komt niet in die if statement dus er is iets fout met m'n conditie..

voor zover ik het snap staat er:
als een string bestaat uit: begint met tab, new line, verticale tab, form feed, carriage return of spatie, vervolgens een : ; ( of een -, vervolgens een of meerdere punct-tekens of letters of cijfers of _, vervolgens geen of 1 : of ), eindigt met een tab, new line, verticale tab, form feed, carriage return of spatie.

uitleg: hij moet beginnen met een spatie, new line etc dat is duidelijk, vervolgens moet hij beginnen met : ; ( of - aangezien ik smileys heb als :) ;) (k) en -_-
dan letters/cijfers voor iets als :puke: of :9 , punct teken voor :) en underscore voor -_-
afsluiten met geen of 1 dubbele punt (bv voor :) geen afsluit teken en voor :puke: een dubbele punt) of haakje (voor (k) ) en eindigen met tab/new line etc etc

wat doe ik fout??

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 26-07 20:55
als je nou eerst alle : puke laat vervangen en daarna alle : p dan heb je het probleem toch niet? (met str_replace)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dat werd op een ander forum ook al gezegd maar ik wil gewoon alle mogelijkheden uitsluiten, bijvoorbeeld als iemand een 6 tussen haakjes wil zetten in zijn tekst wordt dat in dit geval een devil.. ik kan wel al die mogelijkheden uitsluiten maar ik vergeet dan ongetwijfeld andere dingen dus ik wil gewoon dat het in zijn geheel niet kan gebeuren, snappie? :)

Acties:
  • 0 Henk 'm!

  • JER00N
  • Registratie: Maart 2002
  • Niet online
Hehe, je doet veel te moeilijk imho :)
Ik doe het altijd zo:

code:
1
2
3
$TopicContent = ereg_replace(";)", "[img]'smilies/wink.gif'[/img]", $TopicContent);
$TopicContent = ereg_replace("8)7", "[img]'smilies/bonk.gif'[/img]", $TopicContent);
$TopicContent = ereg_replace("8)", "[img]'smilies/coool.gif'[/img]", $TopicContent);


Waar dus $TopicContent de variabele is die de tekst bevat (d0h :P)

Zoals je ook ziet, moet je soms wel even op de volgorde letten. Hierboven staat dus "8 ) 7" boven "8 )". Eerst worden alle 8 ) 7's vervangen, en daarna de resterende 8 )'s.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-07 21:39

MBV

Je kan het voorkomen door het op alfabetische volgorde te doen, met de spatie na de z. Gewoon, om te voorkomen dat je een vergissing maakt. dus zo:

aa
a
c
g
g)

Om even een voorbeeldje te geven. Daar hoort tuurlijk een mooi ifje bij, maar ik hoop dat je mijn bedoeling snapt. Door alfabetische volgorde voorkom je dat je 8) en 8)7 niet bij elkaar hebt staan.

* MBV is lekker vaag bezig

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-07 11:36
Gewoon lekker str_replace blijven gebruiken zou ik zeggen.

I.p.v. ":p" moet je dus ":p " , ":p\r", ":p\n" en ":p\t" gaan vervangen.

dus:
PHP:
1
2
3
str_replace(array(":p " , ":p\r", ":p\n" ,":p\t") 
                     array([img]"smily.png">[/img] ,
                                [img]"smily.png">[/img] ), $text);

[ Voor 79% gewijzigd door stekkel op 02-08-2003 02:45 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ik ben wel voorstander van spatie voor en na, anders wordt al gauw een zin waar je een dubbele punt in gebruikt ook onbedoeld be-smiley-ed :)

Ik gebruikt zelf ongeveer het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// code, image, width, height

$smilies = array(
  array(':)', 'img/smile.gif', 15, 15),
  array(':(', 'img/sad.gif', 15, 15),
  array(';)', 'img/wink.gif', 15, 15),
  array(':))', 'img/biggrin.gif', 15, 15)
); // en meer natuurlijk :)

foreach ($smilies as $smiley) {

  $pattern = '/(?<!\S)'.preg_quote($smiley[0], '/').'(?!\S)/';
  $replace = '<img src="'.$smiley[1].'" width="'.$smiley[2].'" height="'.$smiley[3].'" alt="" />';
  $content = preg_replace($pattern, $replace, $content);

}

[ Voor 9% gewijzigd door crisp op 02-08-2003 02:56 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • kleautviool
  • Registratie: Mei 2003
  • Laatst online: 09:06
Misschien zeg ik nu iets wat je niet bedoelt, maar misschien heb je hier wat aan.
http://forum.web-con.nl/topic.php?topic=11464

Acties:
  • 0 Henk 'm!

  • Icheb
  • Registratie: Augustus 2001
  • Laatst online: 22-07 09:17
Crisp, die code van jou komt me ergens bekend van voor...
een of andere php site ?

Maargoed, zelf heb ik alle smilies in een db gegooid en gebruik ik de volgende functie op het tekstblok waarbij er smilies moeten komen :
(note : dit is nog maar een idee, ik denk dat ik het nog wel verder kan optimaliseren)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function parse_smilies ($msg) {
    $smiliedirectory = "./images/smilies/";
    $msg = addslashes($msg);
    $message = $msg;
    $result = mysql_query("SELECT * FROM smilies");
    while ($smilie = mysql_fetch_object($result)) {
        $smilie2 = addslashes($smilie->code);
        $message = str_replace($smilie2,"[img]'".$smiliedirectory.$smilie->filename."'[/img]",$message); // Smilie
    }
    $message = stripslashes($message);
    return $message;
}


Ik hoop dat mijn methode op deze manier duidelijk is :P

(ik vraag me eigenlijk af wat het snelst is van de methodes die hier op dit moment staan :D)

[ Voor 7% gewijzigd door Icheb op 02-08-2003 10:24 . Reden: onnodige code deel 1 eruit gehaald :D ]

sebsoft.nl


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Icheb schreef op 02 August 2003 @ 10:23:
Crisp, die code van jou komt me ergens bekend van voor...
een of andere php site ?
[...]
100% eigen code, ik heb 'm meer gepost o.a. op PHPFreakz en hij staat ook in de codebase geloof ik.
Jouw methode zal wellicht sneller zijn, maar je blijft met het probleem zitten dat je soms onbedoelt smilies krijgt. Die spatie verplichten is op zich geen probleem als je het combineerd met een click-a-smilie script dat de spaties ook voor je invoegd (en daarvan heb ik ook een voorbeeld staan in de codebase) :)

[ Voor 36% gewijzigd door crisp op 02-08-2003 13:30 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 15-07 09:34

PrinsEdje80

Holographic, not grated...

Used to be Down Under... Foto gallery

Pagina: 1