[PHP] str_replace met variablen werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 17-09 15:48
Ik ben druk bezig met mijn projectje en wilde nu getypte smilies vervangen door plaatjes. Dus ik heb de str_replace erbij gepakt. Alleen zodra ik de search of replace string vervang door een variable gaat het helemaal mis.

Als ik doe:
PHP:
1
2
<? $reply = ":S";
$reply = str_replace(":S", "imgcode", $reply); ?>
Krijg ik netjes 'imgcode' terug. Dat is prima!

Maar als ik nou variablen ga gebruiken:
PHP:
1
2
<? $reply = ":S"; $tag = ":S"; $img = "imgcode";
$reply = str_replace($tag, $img, $reply); ?>
Krijg ik helemaal niets terug, zelfs geen spatie oid.

Als ik alleen "imgcode" vervang door en variable krijg ik ook niets terug, ook geen spatie. Bij alleen ":S" vervangen door een variable krijg ik ":S" weer terug, dus lijkt str_replace helemaal niets te doen.

Die variablen moeten later arrays worden, maar met arrays had ik dezelfde problemen. Nu zag ik op php.net staan dat er een bug is PHP in versies lager dan 4.3.3. (Ik gebruik nog 4.2.2 en kan pas over een poos upgraden naar een hogere versie :()
In PHP versions prior to 4.3.3 a bug existed when using arrays as both search and replace parameters which caused empty search indexes to be skipped without advancing the internal pointer on the replace array. This has been corrected in PHP 4.3.3, any scripts which relied on this bug should remove empty search values prior to calling this function in order to mimick the original behavior.
Als ik het goed begrijp gaat PHP de fout in als ik variablen gebruik die leeg zijn, of iig bij een array met een leeg veld. Maar dat lijkt mij niet van toepassing op mijn bovenstaande constructie. Want er worden (nog) geen arrays gebruikt en de variablen zijn zeker niet leeg.

Weet iemand waar ik hier de fout in ga? Of ligt het hem toch aan de bug in PHP? Alvast bedankt :)

Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Laatst online: 01:02
Regular Expressions
str_replace() gebruiken voor dit doel is domweg ranzig.

Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 17:22
Ik heb deze code even getest op php 4.3.3 (helaas, geen zin om te downgraden naar 4.2) en hij gaf wel gewoon een goede output :S

PHP:
1
2
3
4
5
6
7
8
9
<?PHP
$reply = ":S"; 
$tag = ":S"; 
$img = "imgcode"; 

$reply = str_replace($tag, $img, $reply); 

echo $reply;
?> 

...


Acties:
  • 0 Henk 'm!

  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 17-09 15:48
IceM schreef op 18 april 2004 @ 10:35:
Ik heb deze code even getest op php 4.3.3 (helaas, geen zin om te downgraden naar 4.2) en hij gaf wel gewoon een goede output :S

PHP:
1
2
3
4
5
6
7
8
9
<?PHP
$reply = ":S"; 
$tag = ":S"; 
$img = "imgcode"; 

$reply = str_replace($tag, $img, $reply); 

echo $reply;
?> 
Tnx voor het testen, ik begin nu ernstig te twijfelen aan mijn orginele code...
Ik pruts ff verder. Ik gebruik de str_replace namelijk in een functie en volgens mij komt er een variable niet helemaal goed over.

@sylvesterrr: Ik vind een hele expressie opzetten voor zo'n simpele replace ranzig. Op php.net zelf staat ook:
[...] If you don't need fancy replacing rules (like regular expressions), you should always use this function [...]
En laat ik nou voor dit simpele klusje ff geen 'fancy replacing rules' nodig hebben.

Kortom, volgens mij is str_replace juist gemaakt voor dit soort klusjes. Regular expressions zijn juist weer supper handig om ingewikkelde replace dingen enz op te lossen. Dan voldoet str_replace niet meer. :)

edit:
Woei! Hij doet het :*)
De fout zat idd bij men functie. Ik declareerde de variablen $img en $tag buiten mijn functie en dat blijkt niet te mogen. :o Daar worden namelijk nogal leeg van, vandaar die vreemde resultaten. Stomme fout, maarjah shit happens he.
Iig tnx voor de hulp, die mij mijn fout deed inzien :>

[ Voor 18% gewijzigd door Mac_Cain13 op 18-04-2004 10:54 ]


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

sylvesterrr schreef op 18 april 2004 @ 10:35:
Regular Expressions
str_replace() gebruiken voor dit doel is domweg ranzig.
Dan heb je er toch weinig van begrepen. Regular expressions gebruiken voor een simpele replace zoals dit is overkill, en zal de performance van je scripts niet ten goede komen.

Rustacean


Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Laatst online: 01:02
Manuzhai schreef op 18 april 2004 @ 10:56:
[...]
Regular expressions gebruiken voor een simpele replace zoals dit is overkill, en zal de performance van je scripts niet ten goede komen.
Hij is druk bezig met een projectje, en nu wil hij de smilies gaan parsen. Ik ging er klakkeloos van uit (sorry) dat die smilies in een lang stukje tekst zijn verwerkt (bijv. een nieuwsbericht/forumpost e.d.).


PHP:
1
2
3
4
5
6
7
<? 
$reply = "http://www.ditiseenlink.nl is bladiebla.... :/"; 
$tag = ":/"; 
$img = "<img src=\"/images/smilies/nosmile.gif\" alt=\"nosmile\"";
$reply = str_replace($tag, $img, $reply); 
echo $reply;
?> 

Gaat niet zo goed he? :)

[ Voor 7% gewijzigd door Mawlana op 18-04-2004 11:03 ]


Acties:
  • 0 Henk 'm!

  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 17-09 15:48
sylvesterrr schreef op 18 april 2004 @ 11:03:
[...]

Hij is druk bezig met een projectje, en nu wil hij de smilies gaan parsen. Ik ging er klakkeloos van uit (sorry) dat die smilies in een lang stukje tekst zijn verwerkt (bijv. een nieuwsbericht/forumpost e.d.).
PHP:
1
2
3
4
5
6
7
<? 
$reply = "http://www.ditiseenlink.nl is bladiebla.... :/"; 
$tag = ":/"; 
$img = "<img src=\"/images/smilies/nosmile.gif\" alt=\"nosmile\"";
$reply = str_replace($tag, $img, $reply); 
echo $reply;
?> 

Gaat niet zo goed he? :)
Hmm, ik ben nogal n00b met regular expressions dus ik vond str_replace ook gewoon makkelijker. Alleen staan de smilies idd in een stukje tekst. Alleen waarom zou die replace met een img-tag niet gaan. Hij doet het hier prima hoor :P

Ik heb van die variablen ondertussen een arraytje gemaakt. Alleen is het wel lastig dat ik niet
PHP:
1
str_replace($tag, "blaat".$img, $reply);
Mag doen ipv de inhoud van $img krijg ik dan 'Array' terug. Is hier een simpele oplossing voor? Of moet ik nu toch naar die enge regular expressions ;) Zo jah zou een stukje (pseudo)code niet gek zijn.

[ Voor 5% gewijzigd door Mac_Cain13 op 18-04-2004 11:27 ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
PHP:
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
function smiley($string) 
    {

        $smile = array (
            'Z:)' => '[img]"/smily/s10.gif"[/img]',
            '~:)' => '[img]"/smily/s8.gif"[/img]',
            ':0)' => '[img]"/smily/s16.gif"[/img]',
            ':-)' => '[img]"/smily/s1.gif"[/img]',
            ';-)' => '[img]"/smily/s2.gif"[/img]',
            ':-D' => '[img]"/smily/s3.gif"[/img]',
            ':-p' => '[img]"/smily/s4.gif"[/img]',
            ':-P' => '[img]"/smily/s4.gif"[/img]',
            'db-' => '[img]"/smily/s5.gif"[/img]',
            '|%|' => '[img]"/smily/s6.gif"[/img]',
            ':?(' => '[img]"/smily/s7.gif"[/img]',
            ':-(' => '[img]"/smily/s9.gif"[/img]',
            '8)-' => '[img]"/smily/s11.gif"[/img]',
            ':#(' => '[img]"/smily/s12.gif"[/img]',
            ':-0' => '[img]"/smily/s13.gif"[/img]',
            '|~p' => '[img]"/smily/s14.gif"[/img]',
            '):X' => '[img]"/smily/s15.gif"[/img]'      
            );
        
        for(reset($smile); $key=key($smile); next($smile)) 
            {
            $string = str_replace("$key","$smile[$key]",$string);
            }
        return ($string);
    }


Dit is mijn smiley-script, met array...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 17-09 15:48
Tnx T-MOB!

Alleen vind ik het lastig dat ik steeds die hele img-tag in men array moet hebben. Ik wil graag alleen de naam van het gifje in de array en dan die img-tag statisch ernaast, maar dat is mss met een btje jou script modificeren wel te halen. :) Meer suggesties zijn altijd nog welkom natuurlijk.

Acties:
  • 0 Henk 'm!

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

Dit komt uit een projectje wat ik atm aan 't herschrijven ben, maar misschien heb je er wat aan:
PHP:
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
                $smilies[':arrow:'] = 'arrow.gif';
        $smilies[':evillaugh:'] = 'badgrin.gif';
        $smilies[':D'] = 'biggrin.gif';
        $smilies[':?'] = 'confused.gif';
        $smilies['8)'] = 'cool.gif';
        $smilies[':cry:'] = 'cry.gif';
        $smilies[':doubt:'] = 'doubt.gif';
        $smilies[':evil:'] = 'evil.gif';
        $smilies[':!:'] = 'exclaim.gif';
        $smilies[':idea:'] = 'idea.gif';
        $smilies[':lol:'] = 'lol.gif';
        $smilies[':x'] = 'mad.gif';
        $smilies[':?:'] = 'question.gif';
        $smilies[':P'] = 'razz.gif';
        $smilies[':oops:'] = 'redface.gif';
        $smilies[':roll:'] = 'rolleyes.gif';
        $smilies[':('] = 'sad.gif';
        $smilies[':shock:'] = 'shock.gif';
        $smilies[':)'] = 'smile.gif';
        $smilies[':o'] = 'surprised.gif';
        $smilies[';)'] = 'wink.gif';
        
        foreach($smilies as $key => $value)
        {
            
            $psOutput = str_replace($key,'[img]"'[/img]get_config('template') . '/' . $value . '" 
                                          alt="' . $key . '" />',$psOutput);
            
        }

United we stand, and divided we fall


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
T-MOB schreef op 18 april 2004 @ 11:36:
[....]
Dit is mijn smiley-script, met array...
waarom niet gewoon
PHP:
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
<?php
function smiley($string) 
{

    $smile = array (
        'Z:)' => '[img]"/smily/s10.gif"[/img]',
        '~:)' => '[img]"/smily/s8.gif"[/img]',
        ':0)' => '[img]"/smily/s16.gif"[/img]',
        ':-)' => '[img]"/smily/s1.gif"[/img]',
        ';-)' => '[img]"/smily/s2.gif"[/img]',
        ':-D' => '[img]"/smily/s3.gif"[/img]',
        ':-p' => '[img]"/smily/s4.gif"[/img]',
        ':-P' => '[img]"/smily/s4.gif"[/img]',
        'db-' => '[img]"/smily/s5.gif"[/img]',
        '|%|' => '[img]"/smily/s6.gif"[/img]',
        ':?(' => '[img]"/smily/s7.gif"[/img]',
        ':-(' => '[img]"/smily/s9.gif"[/img]',
        '8)-' => '[img]"/smily/s11.gif"[/img]',
        ':#(' => '[img]"/smily/s12.gif"[/img]',
        ':-0' => '[img]"/smily/s13.gif"[/img]',
        '|~p' => '[img]"/smily/s14.gif"[/img]',
        '):X' => '[img]"/smily/s15.gif"[/img]'      
        );
    return (str_replace (array_keys ($smile), $smile, $string));
}
echo smiley("Z:)");
?>

[ Voor 39% gewijzigd door PrisonerOfPain op 18-04-2004 12:11 ]


Acties:
  • 0 Henk 'm!

  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 17-09 15:48
Tnx iedereen! Het is gelukt :)
Met een beetje combineren en nadenken vond ik dit de beste constructie.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function addsmiley($reply) {
    $smiley = array(
        ":)" => "smile.gif",
        ";)" => "knipoog.gif",
        ";(" => "huil.gif",
        ":P" => "tong.gif",
        ":(" => "boos.gif"
    );

    for(reset($smiley); $key=key($smiley); next($smiley)) {
     $reply = str_replace($key, "[img]\"img/smiley/".$smiley[$key]."\"[/img]", $reply);
    }

    return $reply;
}
Ik heb op deze manier slechts 1 array en alleen de naam van het gifje staat in die array. Niet de hele img-tag, das wel zo overzichtelijk en scheeld weer een btje RAM ;)

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Mac_Cain13 schreef op 18 april 2004 @ 13:39 een stukje code en:
Ik heb op deze manier slechts 1 array en alleen de naam van het gifje staat in die array. Niet de hele img-tag, das wel zo overzichtelijk en scheeld weer een btje RAM ;)
Waarom pass je $reply dan by-value? en waarom niet gewoon een foreach ipv deze 'for-constructie' ?

[ Voor 48% gewijzigd door PrisonerOfPain op 18-04-2004 14:32 ]


Acties:
  • 0 Henk 'm!

  • Thijsmans
  • Registratie: Juli 2001
  • Laatst online: 21:35

Thijsmans

⭐⭐⭐⭐⭐ (5/5)

Ik vind het een erg hippe constructie die ik nog nooit heb gezien, maar ik denk dat deze sneller is :P

PHP:
1
2
3
4
foreach( $smiley AS $charcode => $path )
{
    return str_replace($charcode, 'imgtag'.$path.'/img', $reply);
}

[ Voor 61% gewijzigd door Thijsmans op 18-04-2004 15:31 ]

Privacy-adepten vinden op AVGtekst.nl de Nederlandse AVG-tekst voorzien van uitspraken en besluiten.


Acties:
  • 0 Henk 'm!

  • Blaise
  • Registratie: Juni 2001
  • Niet online
De fout zat idd bij men functie. Ik declareerde de variablen $img en $tag buiten mijn functie en dat blijkt niet te mogen. Daar worden namelijk nogal leeg van, vandaar die vreemde resultaten.
Waarschijnlijk handig om te weten: doe "global $varnaam" aan het begin van de definitie van je function. Op die manier is een variabele ook van kracht binnen de function.

Ik had daar ooit ook wat problemen mee, vandaar :P

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Prammenhanger schreef op 18 april 2004 @ 15:30:
[...]


Ik vind het een erg hippe constructie die ik nog nooit heb gezien, maar ik denk dat deze sneller is :P

PHP:
1
2
3
4
foreach( $smiley AS $charcode => $path )
{
    return str_replace($charcode, 'imgtag'.$path.'/img', $reply);
}
Die werkt niet omdat bij de eerste replacement de loop verlaten wordt vanwege de return statement.

deze is sneller:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function addsmiley($reply) {
    $pre = '[img]"img/smiley/';
[/img]'
    // nog sneller is de complete image tag zonder gebruik van pre en end maar dat vond de 
    // topicstarter niet gewenst
    $smiley = array(
        ':)' => $pre . 'smile.gif' . $end,
        ';)' => $pre . 'knipoog.gif' . $end,
        ';(' => $pre . 'huil.gif' . $end,
        ':P' => $pre . 'tong.gif' . $end,
        ':(' => $pre . 'boos.gif' . $end
    ); 
    // vanaf php 4.0.6 kan je ook arrays als argument gebruiken bij str_replace

    // edit naar aanleiding comment prisonerofpain
    // return str_replace(array_keys($smiley),array_values($smiley),$reply);
    return str_replace(array_keys($smiley),$smiley,$reply);
}

[ Voor 61% gewijzigd door stekkel op 18-04-2004 15:53 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
@stekkel: array_values is niet nodig ;) str_replace kijkt namelijk alleen naar de values, en dan is het een beetje zonde, zie ook het stuk dat ik eerder poste.

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
PrisonerOfPain schreef op 18 april 2004 @ 15:49:
@stekkel: array_values is niet nodig ;) str_replace kijkt namelijk alleen naar de values, en dan is het een beetje zonde, zie ook het stuk dat ik eerder poste.
Daar heb je gelijk in ;)

edit:

zie nu pas dat ik hetzelfde als jou deed. Ik had alleen je eerste post gezien, maar ja great minds think the same ;)

[ Voor 19% gewijzigd door stekkel op 18-04-2004 22:14 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
stekkel schreef op 18 april 2004 @ 15:51:
[...]


Daar heb je gelijk in ;)
Ow, en foreach zit ook pas in php sinds versie 4, dus maakt dat niet zo heel veel uit. ;)

Acties:
  • 0 Henk 'm!

  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 17-09 15:48
stekkel schreef op 18 april 2004 @ 15:44:
[...]
deze is sneller:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function addsmiley($reply) {
    $pre = '[img]"img/smiley/';
[/img]'
    // nog sneller is de complete image tag zonder gebruik van pre en end maar dat vond de 
    // topicstarter niet gewenst
    $smiley = array(
        ':)' => $pre . 'smile.gif' . $end,
        ';)' => $pre . 'knipoog.gif' . $end,
        ';(' => $pre . 'huil.gif' . $end,
        ':P' => $pre . 'tong.gif' . $end,
        ':(' => $pre . 'boos.gif' . $end
    ); 
    // vanaf php 4.0.6 kan je ook arrays als argument gebruiken bij str_replace

    // edit naar aanleiding comment prisonerofpain
    // return str_replace(array_keys($smiley),array_values($smiley),$reply);
    return str_replace(array_keys($smiley),$smiley,$reply);
}
Hey die is cool :P
Die for-loop zat me al niet helemaal lekker. Dit met die variablen pre en end is een mooie constructie! Blijft het tenminste een btje overzichtelijk en snel. Tnx!

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Ach ja, die functie staat er al zo lang... En als zaken naar behoren werken verbeter je ze niet zo snel....

Regeren is vooruitschuiven

Pagina: 1