[PHP] smiley replace probleem (to greedy?)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Ik heb een tabel met allemaal smileys en de bijbehorende codes. Deze lees ik allemaal uit in array. Deze array is opgebouwd als:
PHP:
1
$Smileys[$rowSmileys['smiley_code']] = $rowSmileys['smiley_path'];

Dit levert me dus een array aan met de code en de bijbehorende path naar de smiley.

Vervolgens parse ik de tekst via:
PHP:
1
2
3
4
foreach ($Smileys AS $find => $FileName)
{
$news = str_replace(htmlentities($find), "[img]'".[/img]", $news);
}


maar deze is te greedy. Bijvoorbeeld wanneer ik de smileycode
code:
1
b:)d

neem wordt deze vervangen door de
code:
1
:)

omdat deze als eerste in de array voorkomt (eerder dan de andere). De oplossing is redelijk simpel. Ik bouw een extra kolom in mijn tabel waar ik de lengte van de smiley code string in opsla. Door bij het vullen van de array de SQL query zo in te stellen dat de grootste lengte als eerste eruit gehaald moet worden moet het naar mijn idee goed gaan.

Mijn vraag is of er nog makkelijkere manieren te bedenken zijn dan bovengenoemde oplossing. (Dus zonder aanpassing van de tabel)

Tot slot heb ik nog een probleem met een replace. Ik wil graag de \ vervangen door een / en dacht daarvoor de onderstaande functie te gebruiken:
PHP:
1
$smiley_path = str_replace("\\", "/", $smiley_path);

maar dit levert met een input van "test\image.png" de output "test//image.png".
Er wordt verder niets uitgevoerd op deze variabele dus geen (addslashes). De varaibele wordt via een $_POST opgehaald. :?

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
PHP:
1
$news = preg_replace(htmlentities($find), $rowSmileys['smiley_code'], $rowSmileys['smiley_path'], $news);

probeer dit eens preg_replace (en str_replace) kunnen met array's werken dus hoeft er geen foreach functie voor te pleuren.

Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
De oplossing is redelijk simpel. Ik bouw een extra kolom in mijn tabel waar ik de lengte van de smiley code string in opsla.
Dat is redelijk loos, je kunt toch gewoon zoiets doen:

SQL:
1
SELECT * FROM smilies ORDER BY LENGTH(code) DESC


Iedere normale database ondersteunt als het goed is die LENGTH-functie.... en dan heb je het redelijk snel voor elkaar, gewoon in je huidige query die ORDER BY... toevoegen :)
De varaibele wordt via een $_POST opgehaald.
Kijk 'es in je php.ini of via phpinfo() of je magic_quotes_gpc aan hebt staan? Als dat aanstaat worden variables uit Get, Post en Cookies (GPC) met addslashes bewerkt voordat je ze in je script gebruikt :)

[ Voor 28% gewijzigd door MisterData op 10-09-2004 08:32 ]


Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
Thanks voor beide tips!

magic_quotes_gpc stond inderdaad aan, terwijl ik het getest heb met magic_quotes_gpc uit.

Even testen of magic_quotes_gpc aan staat: zo ja niets doen en anders addslashes gebruiken.

4Real:
Ik snap je code niet helemaal: kan het niet gewoon zo?
PHP:
1
2
3
<?
$news = preg_replace($Smileys['smiley_code'], $Smileys['smiley_path'], $news);
?> 

dit omdat $Smileys mijn array is die ik meegeef aan de functie :?

[ Voor 37% gewijzigd door Schonhose op 10-09-2004 08:56 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

4Real schreef op 10 september 2004 @ 08:30:
PHP:
1
$news = preg_replace(htmlentities($find), $rowSmileys['smiley_code'], $rowSmileys['smiley_path'], $news);

probeer dit eens preg_replace (en str_replace) kunnen met array's werken dus hoeft er geen foreach functie voor te pleuren.
str_replace accepteert ook array's :)

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Ter verduidelijking: je kunt dus gewoon dit doen:

PHP:
1
2
3
$codes = array(":)",":(",":P",":X",":|");
$replace = array("blij","boos","tong","mond_dicht","vaag");
$nieuwetext = str_replace($codes,$replace,$oudetext);


:)

Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Topicstarter
MisterData schreef op 10 september 2004 @ 10:24:
Ter verduidelijking: je kunt dus gewoon dit doen:

PHP:
1
2
3
$codes = array(":)",":(",":P",":X",":|");
$replace = array("blij","boos","tong","mond_dicht","vaag");
$nieuwetext = str_replace($codes,$replace,$oudetext);


:)
Dit is juist ideaal voor een associative array IMHO.
En wat jij voorstelt doe ik nu ook, maar dan in een foreach functie. Uit de verhalen maak ik op dat dit niet meer hoeft en dan ik alleen preg_replace kan gebruiken.

De voorbeelden snap ik, maar hoe werkt het met een associative array?

PHP:
1
2
3
4
$str=":) Test :P";

$assoc[':)'] = "Smile";
$assoc[':P'] = "Tongue";

ik kom niet op de juiste preg_replace :(

[ Voor 31% gewijzigd door Schonhose op 10-09-2004 11:14 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

Verwijderd

Met een associatieve array kan het zo:

PHP:
1
2
3
4
$find = array_keys($smilies);
$replace = array_values($smilies);

$body = str_replace($codes, $replace, $body);
Pagina: 1