web-dev-qa-db-fra.com

Supprimer une chaîne du début d'une chaîne

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.

118
Alex

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.

282
Fabio Mora

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);
48
Tatu Ulmanen
function remove_prefix($text, $prefix) {
    if(0 === strpos($text, $prefix))
        $text = substr($text, strlen($prefix)).'';
    return $text;
}
16
Pavel

Ici.

$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
5
cbrandolino

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
0
Aleksandar Bosakov

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.

0
Inca
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1); 
?>
0