J'essaye d'extraire une sous-chaîne. J'ai besoin d'aide pour le faire en PHP.
Voici quelques exemples de chaînes 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, récupère la chaîne entière.
J'ai essayé,
substr($mystring, 0, strpos($mystring, '/'))
Je pense que cela dit - obtenir la position de /
, puis obtenir la sous-chaîne de la position 0 à cette position.
Je ne sais pas comment gérer le cas où il n'y en a pas /
, sans rendre la déclaration trop grande.
Existe-t-il un moyen de gérer ce cas également sans rendre l'instruction PHP trop complexe?
s($str)->beforeFirst('/')
utile, comme trouvé dans cette bibliothèque autonome .Réponses:
Utilisation
explode()
Dans ce cas, j'utilise le
limit
paramètre toexplode
afin que php ne scanne pas la chaîne plus que ce qui est nécessaire.la source
$arr = explode('/',$mystring,2); echo $arr[0];
. Je ne parviens pas à obtenir la première chaîne dans une instruction elle-même -echo explode('/',$mystring,2)[0];
. Puisque exploser renvoie un tableau, je devrais être capable de le faire correctement? Mais j'obtiens une erreur. Aucune suggestion?explode() + [0]
est une façon fastidieuse d'écrirestrtok($string, "/")
La solution la plus efficace est la
strtok
fonction:Par exemple:
et
la source
current-explode
solution. (Non pas que je l'utilise si souvent que cela compte.)explode
solutions proposées.strtok
estfirst/second
retournerafirst
mais/second
retournerasecond
plutôt qu'une chaîne vide.la source
Et ça :
Ajoutez simplement un '/' à la fin de mystring pour être sûr qu'il y en a au moins un;)
la source
Version en une ligne de la réponse acceptée:
Devrait fonctionner en PHP 5.4+
la source
C'est probablement l'exemple le plus court qui m'est venu à l'esprit:
1)
list()
attribuera automatiquement la chaîne jusqu'à ce"/"
que le délimiteur soit trouvé2) si le délimiteur
"/"
n'est pas trouvé, la chaîne entière sera affectée... et si vous êtes vraiment obsédé par les performances, vous pouvez ajouter un paramètre supplémentaire pour exploser
explode("/", $mystring, 2)
qui limite le maximum des éléments retournés.la source
strtok()
c'est dangereux.strtok()
?strtok()
dangereux?Mieux vaut tard que jamais. php a une fonction prédéfinie pour cela. voici ce bon moyen.
si vous voulez obtenir la partie avant la correspondance, définissez simplement before_needle (3e paramètre) sur
true
http://php.net/manual/en/function.strstr.phpla source
strstr
c'est légèrement plus rapide questrtok
. J'irai avec le premier.La fonction strstr () de 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 5.3, la fonction ci-dessous devrait fonctionner correctement:
Cependant, je ne l'ai pas testé, mais cela devrait très bien fonctionner. Et c'est assez rapide aussi
la source
strstr()
, mais sachez qu'il retournefalse
si la chaîne ne contient pas$needle
, donc lesexplode()
solutions ci-dessus conviennent mieux dans ce cas.Vous pouvez créer une fonction d'assistance pour vous en occuper:
Voici un cas d'utilisation:
la source
Vous pouvez essayer d'utiliser une expression régulière comme celle-ci:
parfois, les expressions régulières sont plus lentes, donc si les performances sont un problème, assurez-vous de les comparer correctement et utilisez une autre alternative avec des sous-chaînes si cela vous convient mieux.
la source
explode
il serait intéressant de voir lequel est le plus rapide.Utiliser
current
surexplode
faciliterait le processus.la source
la source
Vous pouvez également utiliser cette solution en une ligne
la source
Je pense que cela devrait fonctionner?
la source
pourquoi ne pas utiliser:
OU:
la source