201 votes

Extraction de sous-chaîne PHP. Obtenez la chaîne avant le premier '/' ou la chaîne entière

Je suis en train d'essayer d'extraire une sous-chaîne. J'ai besoin d'aide pour le faire en PHP.

Voici quelques chaînes d'exemple avec lesquelles je travaille et les résultats dont j'ai besoin:

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

Je veux obtenir la chaîne jusqu'au premier /, mais si aucun / n'est présent, obtenir la chaîne entière.

J'ai essayé,

substr($mystring, 0, strpos($mystring, '/'))

Je pense que cela signifie - obtenir la position de / et ensuite obtenir la sous-chaîne de la position 0 à cette position.

Je ne sais pas comment gérer le cas où il n'y a pas de /, sans rendre l'instruction trop longue.

Y a-t-il un moyen de gérer ce cas également sans rendre l'instruction PHP trop complexe?

360voto

user2041318 Points 1129

La solution la plus efficace est la fonction strtok :

strtok($maChaine, '/')

REMARQUE : En cas de plus d'un caractère à diviser, les résultats peuvent ne pas répondre à vos attentes par exemple strtok("quelquetchoseaDiviser", "ch") retourne q car il divise par n'importe quel caractère individuel du deuxième argument (dans ce cas h est utilisé).

@friek108 merci d'avoir souligné cela dans votre commentaire.

Par exemple :

$maChaine = 'accueil/chat1/souschat2/';
$premier = strtok($maChaine, '/');
echo $premier; // accueil

et

$maChaine = 'accueil';
$premier = strtok($maChaine, '/');
echo $premier; // accueil

292voto

gnud Points 26854

Utilisez explode()

$arr = explode("/", $string, 2);
$first = $arr[0];

Dans ce cas, j'utilise le paramètre limit pour explode afin que php ne parcourt pas la chaîne plus que nécessaire.

102voto

AndyBrandy Points 436
$premier = explode("/", $chaîne)[0];

16voto

IRCF Points 51

Que diriez-vous de ceci :

substr($mystring.'/', 0, strpos($mystring, '/'))

Il suffit d'ajouter un '/' à la fin de mystring pour être sûr qu'il y en a au moins un ;)

14voto

aimme Points 3152

Tard vaut mieux que jamais. php a une fonction prédéfinie pour cela. voici la bonne manière.

strstr

si vous voulez obtenir la partie avant la correspondance, définissez simplement before_needle (3e paramètre) à true http://php.net/manual/en/function.strstr.php

function not_strtok($string, $delimiter)
{    
    $buffer = strstr($string, $delimiter, true);

    if (false === $buffer) {
        return $string;
    }

    return $buffer;
}

var_dump(
    not_strtok('st/art/page', '/')
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X