[PHP] str_replace

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Hallo iedereen

Ik heb een raar probleempje.
Ik wil een str_replace uitvoeren op een string, maar alleen de eerste 'occurence' moet vervangen worden.
Als ik hier kijk dan lijkt het een makkie. Gewoon een laatste parameter toevoegen.

Dan heb ik dit:

code:
1
$strToParse = str_replace('Address Line', $addressline, $strToParse, 1);

Deze geeft echter een fout:
Fatal error: Only variables can be passed by reference in xxx on line 70
Raar.
Dan maar door een variable vervangen (geen idee waarom dat zou moeten, maargoed.
code:
1
2
$count = 1
$strToParse = str_replace('Address Line', $addressline, $strToParse, $count);


De error is nu verdwenen.
Maar: ie vervangt nog altijd alle occurences.

Nu is het simpel om er iets omheen te scripten, maar ik ben gewoon nieuwsgierig waarom str_replace anders doet dan ik verwacht, en ook alleen maar variablen zou aanvaarden bij het aanroepen? En geen directe int.

Acties:
  • +3 Henk 'm!

  • Eris
  • Registratie: December 2003
  • Laatst online: 10-10 14:26

Eris

-

count
If passed, this will be set to the number of replacements performed.

Dus hij telt het aantal keer dat hij is voor gekomen.

Acties:
  • 0 Henk 'm!

  • Arie-
  • Registratie: December 2008
  • Niet online
Is count niet het aantal vervangen 'occurences': deze variabele krijgt een waarde toegewezen in de aangeroepen functie.

Edit: ik ben te langzaam.

[ Voor 10% gewijzigd door Arie- op 20-10-2016 15:03 ]


Acties:
  • 0 Henk 'm!

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 08-10 09:57
preg_replace heeft wel een limit.

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Oeps, inderdaad een gevalletje van begrijpend lezen..
Het het inderdaad met preg_replace opgelost.

Maareuh, ByRef variablen in core PHP? Ik gebruik niet zoveel PHP, maar ik verwacht toch niet echt om zo'n zaken tegen te komen..

Acties:
  • 0 Henk 'm!

  • Eris
  • Registratie: December 2003
  • Laatst online: 10-10 14:26

Eris

-

PHP:
1
2
3
4
5
<?php
    $string = "Dit is een test Dit is een test Dit is een test Dit is een test";
    str_replace('Dit', 'Test',$string, $count);
    echo $count;
?>


Geeft ook zo als je verwacht keurig 4 weer en niets iets anders..

Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

Carharttguy schreef op donderdag 20 oktober 2016 @ 15:37:
Maareuh, ByRef variablen in core PHP? Ik gebruik niet zoveel PHP, maar ik verwacht toch niet echt om zo'n zaken tegen te komen..
Je kunt het ook direct herkennen aan de ampersand die voor het argument staat in de php docs. Er staat namelijk int &$count.

Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Bee.nl schreef op donderdag 20 oktober 2016 @ 15:54:
[...]

Je kunt het ook direct herkennen aan de ampersand die voor het argument staat in de php docs. Er staat namelijk int &$count.
Nadat ik het wist viel het me inderaad ook op! Toch bedankt om het te melden, kan handig zijn voor toekomstige bezoekers van deze thread.

Acties:
  • 0 Henk 'm!

  • juggle
  • Registratie: December 2003
  • Laatst online: 00:15

juggle

Papa, ondernemer, gamer

For what's worth it.. Als je de penalty van regulier expressies wilt vermijden, gebruik onderstaande code. Is iets sneller ;-)

PHP:
1
2
3
4
$pos = strpos($haystack, $needle);
if ($pos !== false) {
    $newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}

Zoek je mede papa's om gezellig mee te gamen? kijk op: fathersoftweakers.nl


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
juggle schreef op vrijdag 21 oktober 2016 @ 14:14:
For what's worth it.. Als je de penalty van regulier expressies wilt vermijden, gebruik onderstaande code. Is iets sneller ;-)

PHP:
1
2
3
4
$pos = strpos($haystack, $needle);
if ($pos !== false) {
    $newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}
Thanks, is inderdaad duidelijker dan regex!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Carharttguy schreef op donderdag 20 oktober 2016 @ 15:37:
Maareuh, ByRef variablen in core PHP? Ik gebruik niet zoveel PHP, maar ik verwacht toch niet echt om zo'n zaken tegen te komen..
Er zijn toch echt talloze functies in de core library van PHP die spul by ref teruggeven. Misschien is het dus toch beter om erop bedacht te zijn. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
NMe schreef op vrijdag 21 oktober 2016 @ 23:41:
[...]

Er zijn toch echt talloze functies in de core library van PHP die spul by ref teruggeven. Misschien is het dus toch beter om erop bedacht te zijn. ;)
Zou inderdaad wel kunnen, ik ben uit de C# stal. PHP is eerder hobby/projectmatig bij mij. Ik dacht dat er een consensus bestond dat by ref eigenlijk niet meer zou mogen bestaan vanaf 2005.

Acties:
  • 0 Henk 'm!

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 23:27

Pizzalucht

Snotneus.

Carharttguy schreef op vrijdag 21 oktober 2016 @ 23:45:
[...]


Zou inderdaad wel kunnen, ik ben uit de C# stal. PHP is eerder hobby/projectmatig bij mij. Ik dacht dat er een consensus bestond dat by ref eigenlijk niet meer zou mogen bestaan vanaf 2005.
Ik denk dat je call-time pass-by-reference bedoelt, die is inderdaad deprecated vanaf 5.3 en verwijderd in 5.4.
Dus het volgende zou niet meer kunnen:

code:
1
2
3
4
5
6
7
$foo = 1;
echo $foo;
bar(&$foo);
echo $foo;
function bar($foo) {
  $foo = 2;
}

Result > 5.4: fatal error
Result <= 5.4:
code:
1
2
1
2


Gewone references bestaan echter nog wel, dus dit kan wel:
code:
1
2
3
4
5
6
7
$foo = 1;
echo $foo;
bar($foo);
echo $foo;
function bar(&$foo) {
  $foo = 2;
}


Result:
code:
1
2
1
2

[ Voor 6% gewijzigd door Pizzalucht op 22-10-2016 01:32 ]


Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Carharttguy schreef op vrijdag 21 oktober 2016 @ 23:45:
[...]


Zou inderdaad wel kunnen, ik ben uit de C# stal. PHP is eerder hobby/projectmatig bij mij. Ik dacht dat er een consensus bestond dat by ref eigenlijk niet meer zou mogen bestaan vanaf 2005.
Je realiseert je dat ook C# gewoon pass by ref ondersteunt? :? Het is in sommige gevallen gewoon enorm handig.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Carharttguy schreef op donderdag 20 oktober 2016 @ 15:37:


Maareuh, ByRef variablen in core PHP? Ik gebruik niet zoveel PHP, maar ik verwacht toch niet echt om zo'n zaken tegen te komen..
Nog wat uitgebreider: je ziet deze zaken vaak bij functies die eigenlijk uitgebreidere informatie willen retourneren. Strikt genomen zou je dat in een complexere datastructuur kunnen gooien, maar veel van de standard library is al aardig oud. Een voorbeeld hiervan is bijvoorbeeld
http://php.net/manual/en/function.exec.php

Voor de luie mensen:
code:
1
string exec ( string $command [, array &$output [, int &$return_var ]] )


Dan zou de stdlib een structuur moeten verzinnen, wat men niet zo'n prioriteit geeft omdat het gewoon niks oplevert.

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 08-10 23:48

Ventieldopje

I'm not your pal, mate!

afraca schreef op maandag 24 oktober 2016 @ 17:15:
[...]


Nog wat uitgebreider: je ziet deze zaken vaak bij functies die eigenlijk uitgebreidere informatie willen retourneren. Strikt genomen zou je dat in een complexere datastructuur kunnen gooien, maar veel van de standard library is al aardig oud. Een voorbeeld hiervan is bijvoorbeeld
http://php.net/manual/en/function.exec.php

Voor de luie mensen:
code:
1
string exec ( string $command [, array &$output [, int &$return_var ]] )


Dan zou de stdlib een structuur moeten verzinnen, wat men niet zo'n prioriteit geeft omdat het gewoon niks oplevert.
Al hadden ze natuurlijk wel een array terug kunnen sturen en zou je min of meer tupling toe kunnen passen:

PHP:
1
list($output, $status) = exec('uname -a');


Pass by reference is dus ook hier niet nodig :)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Ventieldopje schreef op maandag 24 oktober 2016 @ 17:45:
[...]


Al hadden ze natuurlijk wel een array terug kunnen sturen en zou je min of meer tupling toe kunnen passen:

PHP:
1
list($output, $status) = exec('uname -a');


Pass by reference is dus ook hier niet nodig :)
offtopic:
(licht-offtopic) Dat is niet helemaal gelijk natuurlijk in semantics. Het is namelijk bij de originele functie signature opt-in , dus geef je het niet mee dan kan hij intern gewoon de output weggooien, dat is bij jou niet mogelijk zonder dat de interpreter allemaal belachelijke trucjes doet.

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB

Pagina: 1