Comment supprimer le premier caractère de chaîne en PHP?

Réponses:

330

Pour supprimer tout :depuis le début d'une chaîne, vous pouvez utiliser ltrim :

$str = '::f:o:';
$str = ltrim($str, ':');
var_dump($str); //=> 'f:o:'
Haim Evgi
la source
109
Notez que lrtim supprimera tout :::::. Parfois, ce n'est pas un comportement souhaité.
CoR
5
notez que cela n'est destiné qu'aux caractères uniques. ltrim supprimera tous les caractères de la chaîne fournie: ltrim('prefixprefix_postfix', 'prefix')résultats dans'_postfix';
Cody Django
556

La substr()fonction vous aidera probablement ici:

 $str = substr($str, 1);

Les chaînes sont indexées à partir de 0, et ce deuxième paramètre de fonction prend le cutstart. Faites donc ce 1, et le premier caractère est parti.

mario
la source
35
Soyez conscient de l'unicode. Si vous avez affaire à une chaîne arbitraire (par exemple "Ål <- danois pour l'anguille"), vous devez utiliser mb_substr et spécifier l'encodage.
Thomas Jensen
ce n'est pas une implémentation correcte, cela ne fonctionne pas avec la chaîne de caractères unique "a". si vous essayez une chaîne de caractères unique, substr retourne une valeur booléenne
anru
2
@anru Le manuel indique que si la longueur de la chaîne est égale au paramètre de démarrage, une chaîne vide sera retournée. Avant la version 7, falseétait retourné. Vous devez donc vérifier s'ils sont égaux si ce n'est pas le comportement que vous souhaitez.
rybo111
95

Utilisez substr :

$str = substr($str, 1); // this is a applepie :)
alexn
la source
Excellente réponse! Merci d'avoir partagé! Je ne suis pas sûr de bien comprendre le commentaire de votre code sur Applepie. oO
HoldOffHunger
64

Temps d'exécution pour les 3 réponses:

Retirez la première lettre en remplaçant le cas

$str = "hello";
$str[0] = "";
// $str[0] = false;
// $str[0] = null;
// replaced by �, but ok for echo

Temps d'exécution pour 1.000.000 tests: 0.39602184295654sec


Supprimer la première lettre avec substr ()

$str = "hello";
$str = substr($str, 1);

Temps d'exécution pour 1.000.000 tests: 5.153294801712sec


Supprimer la première lettre avec ltrim ()

$str = "hello";
$str= ltrim ($str,'h');

Temps d'exécution pour 1.000.000 tests: 5.2393000125885sec


Supprimez la première lettre avec preg_replace ()

$str = "hello";
$str = preg_replace('/^./', '', $str);

Temps d'exécution pour 1.000.000 tests: 6.8543920516968sec

Hayenn
la source
Merci. Voir ma mise à jour, cependant. Cela m'a causé un problème lors de l'utilisation de la chaîne mise à jour dans une requête SQL.
rybo111
6
J'ai juste essayé la $str[0] = '';solution et ça n'a pas marché. bien, cependant, si vous prévoyez d'utiliser la variable par exemple pour comparer >ou <cela ne fonctionnera pas. Il compte toujours `` comme + '' par exemple $str = 'hello'; $str[0] = ''; var_dump($str); // string(5) 'ello'
Ian
@Ian: Je suis tombé sur le même problème lors de la récupération des enregistrements d'une API à l'aide d'un mot-clé, var_dump($keyword)j'ai essayé qui montrait la longueur du caractère précédent .. puis j'ai essayé de couper le mot-clé et cela a bien fonctionné var_dump(trim($keyword)).. J'espère que cela aide quelqu'un .. :)
Syed Qarib
3
Cela ne fonctionne pas. La position "supprimé" est remplacée par un octet nul, vous obtenez donc "\ 0hello" au lieu de "hello".
Josef Kufner
1
J'obtiens "Avertissement: impossible d'attribuer une chaîne vide à un décalage de chaîne" pour $ str [0] = "";
Francisco Luz
25

Voici le code

$str = substr($str, 1); 

echo $str;

Production:

this is a applepie :)
Tarun modi
la source
11

Pour supprimer le premier caractère de chaîne en PHP,

$string = "abcdef";     
$new_string = substr($string, 1);

echo $new_string;
Generates: "bcdef"
Chandan Sharma
la source
9
$str = substr($str, 1);

Voir l' exemple 3 du manuel PHP

echo substr('abcdef', 1);     // bcdef

Remarque:

unset($str[0]) 

ne fonctionnera pas car vous ne pouvez pas supprimer une partie d'une chaîne: -

Fatal error: Cannot unset string offsets
Gammerz
la source
9

Mettre à jour

Après d'autres tests, je ne recommande plus de l'utiliser. Cela m'a causé un problème lors de l'utilisation de la chaîne mise à jour dans une requête MySQL et de la modification substrdu problème. J'ai pensé à supprimer cette réponse, mais les commentaires suggèrent qu'elle est plus rapide pour que quelqu'un puisse l'utiliser. Vous pouvez trouver que rogner la chaîne mise à jour résout les problèmes de longueur de chaîne.


Parfois, vous n'avez pas besoin d'une fonction:

$str[0] = '';

Par exemple:

$str = 'AHello';
$str[0] = '';
echo $str; // 'Hello'

Cette méthode modifie la chaîne existante plutôt que d'en créer une autre.

rybo111
la source
Cela semble aussi être plus rapide.
Emanuil Rusev
@EmanuilRusev comment cela? Juste curieux si vous voulez dire qu'il est plus rapide à taper ou qu'il fonctionne plus rapidement.
rybo111
Je veux dire qu'il s'exécute plus rapidement.
Emanuil Rusev
@EmanuilRusev Je serais intéressé si vous pouviez fournir des statistiques que j'ajouterai à la réponse.
rybo111
1
Je dois être prudent avec ça. Le code ci-dessous renvoie bool (false). $ foo = 'livre'; $ bar = 'livre'; $ bar = substr ($ bar, 1); $ foo [0] = ''; var_dump ($ foo === $ bar);
iftrepo
8

La réponse acceptée:

$str = ltrim($str, ':');

fonctionne mais en supprimera plusieurs :lorsqu'il y en a plusieurs au début.

$str = substr($str, 1);

supprimera tout caractère dès le début.

cependant,

if ($str[0] === ':')
    $str = substr($str, 1);

fonctionne parfaitement.

Dan Bray
la source
6

vous pouvez utiliser la fonction sbstr ()

$amount = 1;   //where $amount the the amount of string you want to delete starting  from index 0
$str = substr($str, $amount);
Adeojo Emmanuel IMM
la source
2

Supprime les occurrences de chaque mot dans un tableau depuis le début et la fin d'une chaîne + un espace et éventuellement des caractères uniques supplémentaires comme par le trim normal ()

<?php
function trim_words($what, $words, $char_list = '') {
    if(!is_array($words)) return false;
    $char_list .= " \t\n\r\0\x0B"; // default trim chars
    $pattern = "(".implode("|", array_map('preg_quote', $words)).")\b";
    $str = trim(preg_replace('~'.$pattern.'$~i', '', preg_replace('~^'.$pattern.'~i', '', trim($what, $char_list))), $char_list);
    return $str;
}

// for example:
$trim_list = array('AND', 'OR');

$what = ' OR x = 1 AND b = 2 AND ';
print_r(trim_words($what, $trim_list)); // => "x = 1 AND b = 2"

$what = ' ORDER BY x DESC, b ASC, ';
print_r(trim_words($what, $trim_list, ',')); // => "ORDER BY x DESC, b ASC"
?>
Ben
la source
1

Le code fonctionne bien pour moi.

$str = substr($str ,-(strlen($str)-1));

Peut-être aussi contribuer avec des réponses.

Claudionor Oliveira
la source
1
celui-ci ne fonctionne pas avec une chaîne de caractères unique: comme "a"
anru
Vous avez raison =) Donc, croyez qu'une solution possible serait de tester avant qu'il ne contienne qu'un seul caractère. Par exemple: $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): $ str; Ou $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): ''; parce que l'idée est de supprimer le dernier caractère, si vous n'en avez qu'un ...: P
Claudionor Oliveira
1

utiliser la fonction mb_substr

    mb_substr("我abc", 1);
风声 猎猎
la source
Utile si le personnage est un symbole monétaire.
Raymie