Supprimer le premier mot d'une chaîne de caratères avec PHP

Publié le 28/11/2021 • Mis à jour le 03/12/2021


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment supprimer le premier mot d'une chaîne de caratères avec PHP. Dans l'exemple suivant, nous ne pouvons pas utiliser une simple fonction de substitution ou la chaîne "DoNotremoveMe" serait aussi modifiée, c'est ce que nous voulons éviter. On peut utiliser la fonction preg_replace et utiliser le caratère spécial ^ qui marque le début de chaîne. Avec le composant String de Symfony on peut utiliser la fonction replaceMatches avec la même expression régulière. On ne doit pas oublier d'échapper le mot à remplacer dans le cas ou il contiendrait des caractères spéciaux (ce n'est pas le cas ici avec la chaîne "removeMe").
[Edit 03-12-2021] Bonne nouvelle : Depuis Symfony 5.4, il y a une nouvelle fonction trimPrefix() pour ce cas d'usage.


<?php

declare(strict_types=1);

// src/Controller/Snippet/Snippet176Trait.php

namespace App\Controller\Snippet;

use App\Helper\String\StringHelper;
use function Symfony\Component\String\s;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 *
 * @property StringHelper $stringHelper
 */
trait Snippet176Trait
{
    public function snippet176(): void
    {
        $string = 'removeMe|meow|DoNotremoveMe|cat';
        $word = 'removeMe';
        $excapedWord = preg_quote($word, '/');
        echo 'string: '.$string;
        echo "\n";
        echo 'needle: '.$word;
        echo "\n\n";

        echo "—— With pure PHP —————————————————————————————————————————————————\n";
        $result = preg_replace("/^$excapedWord/", '', $string);
        echo $result;
        echo "\n";

        echo "\n";
        echo "—— With the Symfony string component —————————————————————————————\n";
        echo s($string)->replaceMatches("/^$excapedWord/", '')->toString();

        echo "\n";
        echo "\n";
        echo "—— Or, as of Symfony 5.4 —————————————————————————————————————————\n";
        echo s($string)->trimPrefix($word);
        echo "\n";

        echo "\n";
        echo "—— With my Symfony string component helper ———————————————————————\n";
        echo $this->stringHelper->s($string)->trimStartingWord($word);
        echo "\n";

        // this trimStartingWord() function is just a shortcut for the previous call.

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Plus sur le web

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use App\Helper\String\StringHelper;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use function Symfony\Component\String\s;

/**
 * @covers Snippet176Trait
 */
final class Snippet176Test extends KernelTestCase
{
    private StringHelper $stringHelper;

    protected function setUp(): void
    {
        $this->stringHelper = self::getContainer()->get(StringHelper::class);
    }

    /**
     * @covers Snippet176Trait::snippet176
     */
    public function testSnippet176(): void
    {
        $string = 'removeMe|meow|DoNotremoveMe|cat';
        $word = 'removeMe';
        $escapedWord = preg_quote($word, '/');
        $expected = '|meow|DoNotremoveMe|cat';

        $result = preg_replace("/^$escapedWord/", '', $string);
        self::assertSame($expected, $result);

        $result = s($string)->replaceMatches("/^$escapedWord/", '')->toString();
        self::assertSame($expected, $result);

        $result = s($string)->trimPrefix($word)->toString();
        self::assertSame($expected, $result);

        $result = $this->stringHelper->s($string)->trimStartingWord($word);
        self::assertSame($expected, $result);
    }
}