Extraction de sous-chaîne PHP. Obtenez la chaîne avant le premier ' / ' ou la chaîne entière
J'essaie d'extraire une sous-chaîne. J'ai besoin d'aide avec faire ça en PHP.
Voici quelques exemples de chaînes avec lesquels 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, obtenez la chaîne entière.
J'ai essayé,
substr($mystring, 0, strpos($mystring, '/'))
, je pense qu'il dit - obtenir la position de /
, puis le sous-chaîne à partir de la position 0 à que position.
Je ne sais pas comment gérer le cas où il y a non /
, sans faire la déclaration trop grande.
Existe-t-il un moyen de gérer ce cas aussi sans rendre L'instruction PHP trop complexe?
14 réponses
Qu'en est-il de ceci:
substr($mystring.'/', 0, strpos($mystring, '/'))
Ajoutez simplement un ' / ' à la fin de mystring afin que vous puissiez être sûr qu'il y en a au moins un;)
C'est probablement l'exemple le plus court qui m'est venu à l'esprit:
list($first) = explode("/", $mystring);
1) list()
attribuera automatiquement la chaîne jusqu'à "/"
si le délimiteur est 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 la performance, vous pouvez ajouter un paramètre supplémentaire à explode explode("/", $mystring, 2)
qui limite le maximum des éléments retournés.
Version D'une ligne de la réponse acceptée:
$out=explode("/", $mystring, 2)[0];
Devrait fonctionner en PHP 5.4 +
La fonction strstr () en PHP 5.3 devrait faire ce travail.. Le troisième paramètre doit être défini sur true..
Mais si vous n'utilisez pas 5.3, alors la fonction ci-dessous devrait fonctionner avec précision:
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é, mais cela devrait fonctionner très bien.. Et c'est assez rapide
La fin est mieux que jamais. php a une fonction prédéfinie pour cela. ici, c'est que bon sens.
strstr
Si vous voulez obtenir la partie avant match ensemble before_needle (3ème paramètre) de 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', '/')
);
Utiliser current
sur {[2] } faciliterait le processus.
$str = current(explode("/", $str, 2));
Vous pouvez créer une fonction d'aide pour prendre soin de cela:
/**
* Return string before needle if it exists.
*
* @param string $str
* @param mixed $needle
* @return string
*/
function str_before($str, $needle)
{
$pos = strpos($str, $needle);
return ($pos !== false) ? substr($str, 0, $pos) : $str;
}
Voici un cas d'utilisation:
$sing = 'My name is Luka. I live on the second floor.';
echo str_before($sing, '.'); // My name is Luka
Vous pouvez essayer d'utiliser une expression rationnelle comme ceci:
$s = preg_replace('|/.*$|', '', $s);
Parfois, les expressions rationnelles sont plus lentes, donc si les performances sont un problème, assurez-vous de les comparer correctement et d'utiliser une autre alternative avec des sous-chaînes si cela vous convient mieux.
$string="kalion/home/public_html";
$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));
Je pense que cela devrait fonctionner?
substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring)));
Pourquoi ne pas utiliser:
function getwhatiwant($s)
{
$delimiter='/';
$x=strstr($s,$delimiter,true);
return ($x?$x:$s);
}
Ou:
function getwhatiwant($s)
{
$delimiter='/';
$t=explode($delimiter, $s);
return ($t[1]?$t[0]:$s);
}