J'ai une chaîne qui ressemble à ceci:
$str = "bla_string_bla_bla_bla";
Comment puis-je supprimer le premier bla_
; mais seulement si on le trouve au début de la chaîne?
Avec str_replace()
, il supprime tous bla_
's.
Forme simple, sans regex:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Prend: 0,0369 ms (0,000,036,954 secondes)
Et avec:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
Prend: 0,1749 ms (0,000174,999 secondes) la première fois (compilation) et 0,0510 ms (0,000151,021 secondes) après.
Profilé sur mon serveur, évidemment.
Vous pouvez utiliser des expressions régulières avec le symbole caret (^
) qui ancre la correspondance au début de la chaîne:
$str = preg_replace('/^bla_/', '', $str);
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
Ici.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
Belle vitesse, mais c'est dur à coder pour dépendre de l'aiguille se terminant par _. Existe-t-il une version générale? - toddmo 29 juin à 23h26
Une version générale:
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
Quelques repères:
<?php
$iters = 100000;
$start = "/aaaaaaa/bbbbbbbbbb";
$full = "/aaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee";
$end = '';
$fail = false;
$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
if (strpos($full, $start) === 0) {
$end = substr($full, strlen($start));
} else {
$fail = true;
}
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "strpos+strlen", $t);
$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
$parts = explode($start, $full, 2);
if ($parts[0] === '') {
$end = $parts[1];
} else {
$fail = true;
}
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "explode", $t);
Sur mon vieux PC à la maison:
$ php bench.php
Les sorties:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Je pense que substr_replace fait ce que vous voulez, vous pouvez limiter votre remplacement à une partie de votre chaîne: http://nl3.php.net/manual/fr/function.substr-replace.php (This vous permettra de ne regarder que le début de la chaîne.)
Vous pouvez utiliser le paramètre count de str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ), ce qui vous permettra de limiter le nombre de remplacements, à partir du à gauche, mais il ne sera pas forcé d'être au début.
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1);
?>