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?

12voto

glyph Points 438

Version en une ligne de la réponse acceptée:

$out=explode("/", $mystring, 2)[0];

Devrait fonctionner en php 5.4+

9voto

pavlovich Points 1818

C'est probablement le plus court exemple qui me vient à l'esprit :

list($first) = explode("/", $mystring);

1) list() va automatiquement assigner la chaîne jusqu'à "/" si le délimiteur est trouvé
2) si le délimiteur "/" n'est pas trouvé, alors la chaîne entière sera assignée

...et si vous êtes vraiment obsédé par les performances, vous pouvez ajouter un paramètre supplémentaire à explode explode("/", $mystring, 2) qui limite le nombre maximum des éléments retournés.

5voto

Jeff Trull Points 101

Vous pouvez essayer d'utiliser une expression régulière comme ceci :

$s = preg_replace('|/.*$|', '', $s);

Parfois, les expressions régulières sont plus lentes, donc si les performances posent problème, assurez-vous de les tester correctement et utilisez une autre alternative avec des sous-chaînes si cela vous convient mieux.

5voto

Ronald Points 31

La fonction strstr() en PHP 5.3 devrait faire ce travail.. Le troisième paramètre doit cependant être défini sur true..

Mais si vous n'utilisez pas la version 5.3, alors la fonction ci-dessous devrait fonctionner correctement :

function strbstr( $str, $char, $start=0 ){
    if ( isset($str[ $start ]) && $str[$start]!=$char ){
        return $str[$start].strbstr( $str, $char, $start+1 );
    }
}

Je ne l'ai pas testé cependant, mais cela devrait fonctionner correctement.. Et c'est assez rapide aussi

3voto

user1518659 Points 495

Utiliser current sur explode faciliterait le processus.

 $str = current(explode("/", $str, 2));

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