2011-04-06 5 views
1

J'ai une chaînephp preg_replace point d'interrogation ("?") - ne fonctionne pas

$name = "name1?name2?name3?name4"; 

Je souhaite modifier cette variable

$name2 = "name1/name2/name3/name4"; 

utilisant php preg_replace.

Comment est-ce que je peux faire ceci?

+2

Pouvez-vous nous montrer ce que vous avez déjà essayé?Le titre et le tag de votre question impliquent que vous avez pris quelques photos du problème, mais votre question semble entièrement dépourvue de code. – Charles

Répondre

4

Vous devez échapper à la ? avec \

<?php 
$string = 'name1?name2?'; 
$pattern = '/\?/'; 
$replacement = '/'; 
echo preg_replace($pattern, $replacement, $string); 
?> 

Il est temps de tester ...

Je maintiens ma réponse, car elle répondait directement à la question de l'OP. Mais mon commentaire de vitesse n'était pas précis - du tout. Les différences que je trouvais sont faciles à voir, mais ne sont pas qu'impressionnant OMI *

L'indice de référence. Je pris la chaîne de OP et concaténé il 500000 fois - de sorte que chaque fonction aurait beaucoup de remplacements à faire (1,5 ou 2 millions selon).

Voici les fonctions et leurs vitesses:

str_replace('?', '/', $test); // name1/name2/name3/name4/ 
0.388642073 
0.389673948 
0.385308981 

preg_replace('/\?/', '/', $test); // name1/name2/name3/name4/ 
0.812348127 
0.812065840 
0.819634199 

$bad = array('1?','2?','3?'); 
$good = array('1/','2/','3/'); 
str_replace($bad, $good, $test); // name1/name2/name3/name4? 
0.712552071 
0.725568056 
0.718420029 

preg_replace('/\?(\w+\d+)/', '/$1', $test); // name1/name2/name3/name4? 
1.515372038 
1.516302109 
1.517566919 

Alors ... je perds. Ce test a montré que str_replace() était 2X plus rapide que preg_replace(). Mais, 1,5 secondes vs 0,7 secondes (deux dernières fonctions) n'est pas mauvais quand vous considérez que les 1,5 million de remplacements sont terminés - sans compter que le dernier résoudra beaucoup plus de combinaisons que son concurrent. Vous ne voulez pas la pompe fist-célébration lorsque vous écrivez cette fonction RegEx parfaite? :-)

+0

preg_replace() est plus rapide que str_replace() – Dawson

+0

oh .. merci ... :) –

+1

avez-vous les chiffres pour sauvegarder votre déclaration que preg_replace() est plus rapide que str_replace(). Cela contredit ce que la plupart des gens disent à propos des deux. –

7

Vous pouvez facilement faire avec str_replace. Je ne pense pas qu'il y ait un besoin de la famille preg

$name2=str_replace("?","/",$name) 
+0

merci ...... :) –

+0

@blasteralfred: La plupart des bienvenus –

+0

pouvez-vous me dire la différence entre 'str_replace' et' preg_replace' ??? –

1

Vous pouvez utiliser str_replace, comme dit @Shakti.

Ou, si vous insistez pour le faire avec preg_replace, vous pouvez faire comme ceci:

$name2 = preg_replace("|\?|", "/", $name); 
echo $name2; 

La différence entre str_replace et preg_replace est, preg_replace faire remplacement à l'aide regex. Et, sur regex, le caractère ? a une signification particulière. Afin de le rendre inutile à preg_replace, vous devez lui échapper en utilisant \.

Pour plus d'informations, rendez-vous, lisez la description de chaque fonction sur le manuel PHP:

+0

je l'ai eu .. merci .. vraiment utile .. J'ai utilisé 'preg_replace (" /?/","/", $ Name);' et il a échoué .. vous connaissez la raison ?? –

+1

vous avez oublié d'échapper '?'. Il a une signification spéciale sur regex (qui est ce qui est utilisé par preg_replace). Afin de le rendre sans signification, vous devez lui échapper, en utilisant '\' – ariefbayu

+0

+1 pour ne pas échapper votre personnage d'échappement. – Dawson