advanced str_replace

Door Robert Deiman, 14 jaar geleden, 2.844x bekeken

Ik kwam van de week een probleem tegen met het gebruiken van arrays in de str_replace functie voor de te vervangen items, en de string waardoor het vervangen wordt.
Zo wordt micro/combi (afkorting voor microwave/combination, combimagnetron in het nederlands) wanneer je een array hebt voor de te vervangen items (micro/combi en micro) dubbel vervangen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    $string
= 'micro/combi';
    $replace = array('micro/combi','micro');
    $replacewith = array('microwave/combination','microwave');
?>

Dit toepassen op de str_replace zal microwavewave/combination terug geven.

Eerst wordt 'micro/combi' vervangen door 'microwave/combination' en daarna wordt 'micro' uit het nieuwe woord ook nog eens vervangen door 'microwave'.

Dit is natuurlijk niet de bedoeling, je krijgt zo wel heel rare namen voor de apparaten. Daarvoor heb ik de onderstaande functie geschreven.

Voorbeeld: http://www.robertdeiman.net/phphulp/arrayreplace.php

Gesponsorde koppelingen

PHP script bestanden

  1. advanced-strreplace

 

Er zijn 19 reacties op 'Advanced strreplace'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jesper Diovo
Jesper Diovo
14 jaar geleden
 
0 +1 -0 -1
Ziet er netjes uit hoor, Robert ;-).
Bas IJzelendoorn
Bas IJzelendoorn
14 jaar geleden
 
0 +1 -0 -1
ziet er inderdaad netjes uit! nice work!
Storeman storeman
storeman storeman
14 jaar geleden
 
0 +1 -0 -1
Waarom niet gewoon iets langer nadenken over je replace?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
    $string
= 'micro/combi';
    $replace = array('micro','microwave/combi');
    $replacewith = array('microwave', 'microwave/combination');
?>
  
Robert Deiman
Robert Deiman
14 jaar geleden
 
0 +1 -0 -1
@Djemo en nimtex

Dankjulliewel

@storeman
Kijk nog eens goed naar je voorbeeld. 'micro/combi' wordt helemaal niet vervangen bij jou (in je replace array heb je 'microwave/combi staan). Daarnaast is het zo dat je niet altijd invloed hebt over hoe je de gegevens binnen krijgt. De volgorde van de array maakt ook in jou geval niets uit. Hij moet gewoon de replace stoppen, op het moment dat er 1 item is vervangen.
Storeman storeman
storeman storeman
14 jaar geleden
 
0 +1 -0 -1
@robert
Mijn voorbeeld werkt zeker wel. De output wordt mbv str_replace() microwave/combination. Doordat de micro eerder wordt toegepast ontstaat er eerst microwave/combi, welke wordt vervangen door microwave/combination vanuit de 2e index.

Ik zou denken dat alleen soorteren op stringlengte (van kort naar lang) al genoeg zou moeten doen.
Robert Deiman
Robert Deiman
14 jaar geleden
 
0 +1 -0 -1
@storeman
Daar heb je wel gelijk in, maar het is voor jezelf (of voor een ander) toch veel gemakkelijker werken wanneer je gewoon 1-op-1 aan kan geven wat precies waardoor vervangen moet worden? Je gaat er nu "omheen werken".
Ga er eens vanuit dat je dit voor een bedrijf gaat gebruiken, en de mogelijkheden in een database hebt staan. Moet nu dat bedrijf gaan nadenken over hoe het wordt omgezet? Dacht ik niet, daarom dus dit script. Op stringlengte sorteren kan ook prima, nu weet je zeker dat hetgeen je wilt ook juist veranderd wordt. Je hoeft het niet te gebruiken, en ook zeker niet toe te passen, maar je klant het moeilijk maken lijkt me geen goede optie.
Storeman storeman
storeman storeman
14 jaar geleden
 
0 +1 -0 -1
Ik snap je punt natuurlijk, jou methode is gewoon helder en het zit netjes in elkaar, je mag er echter wel vanuit gaan dat iemand die je code wil zien bekend is met de str_replace functie (en dus de valkuilen). Als je geen controle hebt over de input van de replace, is jou functie zeker een waardevolle toevoeging, ik ga hem dan ook zeker in mijn lib plakken ;).
Robert Deiman
Robert Deiman
14 jaar geleden
 
0 +1 -0 -1
@Storeman

Mooizo, ik dacht even dat we elkaar verkeerd begrepen, maar we begrijpen elkaar precies ;) Het gaat er inderdaad om dat je als scripter niet de controle hebt over de input van de replace.
Joren de Wit
Joren de Wit
14 jaar geleden
 
0 +1 -0 -1
Leuke functie maar ik denk toch dat een preg_replace in combinatie met een foreach loopje hier handiger in het gebruik is. Een klein voorbeeldje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$aReplacements
= array(
    'micro/combi' => 'microwave/combination',
    'micro' => 'microwave'
);

$sString = 'The micro/combi is a micro and oven in one';

foreach($aReplacements as $sOld => $sNew)
{

    $sString = preg_replace('_\s'.$sOld.'\s_i', ' '.$sNew.' ', $sString);
}


echo $sString;
?>

Deze regex is lang niet optimaal, maar daar kun je natuurlijk nog aan sleutelen. Het gebruik van een regex daarentegen biedt je meer vrijheden dan deze functie nu biedt. Misschien leuk om ook eens naar te kijken ;)
Robert Deiman
Robert Deiman
14 jaar geleden
 
0 +1 -0 -1
@Blanche
Klopt, en ik ken die mogelijkheid ook. Waar mijn probleem eigenlijk lag was dat de str_replace met een array niet kan stopt op het moment dat de replacement heeft plaatsgevonden. Hij blijft doorlopen.
In dit geval werkte het al met een str_replace (het ging ook niet om stukken uit zinnen, maar alles wat eruit kwam was de tekst 'micro/combi' of 'micro'). Daarnaast is deze manier sneller dan jou preg_replace (indien de tekst die je wil veranderen ook de hele tekst is) omdat die niet op een regel hoeft te zoeken, en ook niet het hele rijtje af moet zoeken.

Ik waardeer je opmerking zeker wel, maar in dit geval was de oplossing die hierboven staat de meest handige.
Storeman storeman
storeman storeman
14 jaar geleden
 
0 +1 -0 -1
@robert, blanche

Op grotere strings is preg_replace veel!!! langzamer dan een str_replace, wel een afweging die je moet maken, het verschil is te groot om te negeren, ondanks de flexibiliteit.

Ooit een discussie over begonnen: http://www.phphulp.nl/forum/showtopic.php?cat=1&id=43941&lasttopic=1
Joren de Wit
Joren de Wit
14 jaar geleden
 
0 +1 -0 -1
Quote:
Daarnaast is deze manier sneller dan jou preg_replace (indien de tekst die je wil veranderen ook de hele tekst is) omdat die niet op een regel hoeft te zoeken, en ook niet het hele rijtje af moet zoeken.
Zeker, als je inderdaad enkel 1 woord(combinatie) hoeft te vervangen, is de functie die je gemaakt hebt sneller. Ik zat meer te denken aan teksten waarin je woorden wilt vervangen...

Quote:
Op grotere strings is preg_replace veel!!! langzamer dan een str_replace
Snelheid vs. Functionaliteit. Dat is precies waar we het in dat topic ook over gehad hebben. In elke applicatie zul je de afweging moeten maken welke methode in dat geval de meest efficiente manier is. Het is onmogelijk om te zeggen dat je altijd str_replace() of altijd preg_replace() moet gebruiken omdat de een nu eenmaal beter is dan de andere. Dat is appels met peren vergelijken en zoals we weten is dat niet mogelijk...
Robert Deiman
Robert Deiman
14 jaar geleden
 
0 +1 -0 -1
@Blanche
Daarom heb ik dit ook geschreven, dit is in deze situatie de snelste manier. Wanneer je stukken uit teksten moet vervangen, dan is de preg_replace() een veel betere optie. Het gaat hier dus niet om hele teksten, maar een verandering in terminologie.
De woorden micro/combi en micro komen zo uit een .csv bestandje, maar dat is niet netjes voor weergave op een website.
Steff   an
Steff an
14 jaar geleden
 
0 +1 -0 -1
Quote:
Dat is appels met peren vergelijken en zoals we weten is dat niet mogelijk...


Vergelijken kan wel... optellen niet :P
Jeroen Langenberg
Jeroen Langenberg
14 jaar geleden
 
0 +1 -0 -1
Appels en peren kan je ook niet optellen hoor. Je kan ze wel wiskundig aan elkaar gelijk stellen en vervolgens optellen. Dat heet 2-termige vergelijkingen oplossen. ;)
Jeffrey
Jeffrey
14 jaar geleden
 
0 +1 -0 -1
Of je eet ze gewoon op, nog makkelijker, scheelt een hoop vergelijken en optellen. ;-)
Marcel
Marcel
14 jaar geleden
 
0 +1 -0 -1
Zet hier een kruisje neer als je met je hand tegen je voorhoofd aan hebt geslagen toen je het bovenstaande bericht van Jeroen Langenberg las: x
Marcel
Marcel
14 jaar geleden
 
0 +1 -0 -1
Trouwens, dit is ook een leuke:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    echo strtr($sStartitem,array ( 'micro/combi' => 'microwave/combination' , 'micro' => 'microwave' ) ).'<br />';
?>
Werkt ook wel lekker :-P
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robert Deiman
Robert Deiman
13 jaar geleden
 
0 +1 -0 -1
@Marcel

Die kende ik niet, maar je hebt hem nog wel verkeerd staan.. Voor de komma moet een array zijn met de te vervangen waarden, en na de komma een array, met hetzelfde aantal waarden in dezelfde volgorde die de uiteindelijke waarde vormen.
In mijn geval kan je de keuze maken voor een gewone str_replace of de versie waarbij die eruit breekt wanneer de vervanging heeft plaats gevonden. (dat voorkomt de fouten die ik aangaf.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. advanced-strreplace

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.