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?

116
demandé sur gnud 2009-12-20 17:07:02

14 réponses

Utiliser explode()

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

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

201
répondu gnud 2009-12-20 14:21:28

La solution la plus efficace est la strtok Fonction:

strtok($mystring, '/')

Par exemple:

$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home

Et

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home
199
répondu jmarceli 2016-08-25 23:32:42
$first = explode("/", $string)[0];
91
répondu AndyBrandy 2017-05-19 07:33:41

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;)

9
répondu IRCF 2011-03-30 14:25:54

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.

7
répondu pavlovich 2015-04-23 14:18:33

Version D'une ligne de la réponse acceptée:

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

Devrait fonctionner en PHP 5.4 +

6
répondu glyph 2017-05-19 07:37:24

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

5
répondu Ronald 2011-03-08 15:18:02

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', '/')
);
4
répondu aimme 2017-05-19 07:28:40

Utiliser current sur {[2] } faciliterait le processus.

 $str = current(explode("/", $str, 2));
2
répondu user1518659 2012-12-31 07:14:09

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
2
répondu Toby Speight 2016-08-24 13:41:03

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.

2
répondu t00ny 2017-05-19 07:30:25
$string="kalion/home/public_html";

$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));
0
répondu kalion 2012-01-20 10:23:49

Je pense que cela devrait fonctionner?

substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring)));
-1
répondu Franz 2009-12-20 14:11:33

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);
   }
-1
répondu user1123382 2013-09-13 07:32:06