Réponses:
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,000,174,999 secondes) la première exécution (compilation) et 0,0510 ms (0,000,051,021 secondes) après.
Profilé sur mon serveur, évidemment.
if(condition) { statement }aurait été tellement plus clair.
if (substr($str, 0, strlen($prefix)) == $prefix) peut être modifié pour if (0 === strpos($str, $prefix))éviter une allocation de mémoire inutile tout en conservant la même lisibilité :)
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);
substr()version ... Je suppose que c'est le cas, et devrait être marqué comme une bonne réponse.
preg_quote'd
multibytecauchemar est un autre problème avec d'autres solutions alors que cela fonctionne bien si l'encodage du fichier est correct. Quoi qu'il en soit, cela ne devrait pas être dans le cadre de cette question, donc je m'en fiche.
substret strposne peut pas accepter un tableau. Voilà, un gain de performances certain si vous avez affaire à un tableau. À votre santé!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''n'est pas nécessaire.
(substr($str, 0, strlen($prefix)) == $prefix)la réponse acceptée ressemblait plus à
Ici.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_. Existe-t-il une version générale?
Je pense que substr_replace fait ce que vous voulez, où vous pouvez limiter votre remplacement à une partie de votre chaîne: http://nl3.php.net/manual/en/function.substr-replace.php (Cela 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 ), cela vous permettra de limiter le nombre de remplacements, en commençant par la gauche, mais ne l’imposera pas au début.
substr_replaceremplacera les caractères de la plage donnée, qu'il s'agisse du préfixe que vous souhaitez supprimer ou autre. L'OP souhaite supprimer bla_"uniquement s'il se trouve au début de la chaîne".
Bonne vitesse, mais c'est codé en dur pour dépendre de l'aiguille se terminant par _. Existe-t-il une version générale? - toddmo le 29 juin à 23:26
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 personnel:
$ php bench.php
Les sorties:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Voici une approche encore plus rapide:
// strpos is faster than an unnecessary substr() and is built just for that
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Cela supprimera la première correspondance partout où elle se trouve, c'est-à-dire le début, le milieu ou la fin.
$str = substr($str, 0, strpos($str, $prefix)).substr($str, strpos($str, $prefix)+strlen($prefix));
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1);
?>
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
fait maintenant ce que vous voulez.
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()la fonction $countdevrait être une variable transmise par référence pour contenir le nombre de remplacements trouvés, et non pour limiter le nombre de remplacements.
Supprimez www. depuis le début de la chaîne, c'est le moyen le plus simple (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");ne ferait le travail que si le domaine ne commencerait pas par un "w". ltrim ('m.google.com', ".omg")se traduit par le.com.
ltrim, il n'est pas utilisé correctement. le deuxième paramètre est une liste de caractères à découper; donc un seul "w."suffirait.
s($str)->replacePrefix('_bla')utile, comme trouvé dans cette bibliothèque autonome .