web-dev-qa-db-fra.com

Comment tout obtenir après un certain personnage?

J'ai une ficelle et j'aimerais tout obtenir après une certaine valeur. La chaîne commence toujours par un ensemble de chiffres, puis un trait de soulignement. Je voudrais obtenir le reste de la chaîne après le trait de soulignement. Donc, par exemple, si j'ai les chaînes suivantes et ce que j'aimerais que je retourne:

"123_String" -> "String"
"233718_This_is_a_string" -> "This_is_a_string"
"83_Another Example" -> "Another Example"

Comment puis-je faire quelque chose comme ça?

105
user1048676

Le strpos() trouve le décalage du trait de soulignement, puis substr extrait tout de cet index plus 1.

$data = "123_String";    
$whatIWant = substr($data, strpos($data, "_") + 1);    
echo $whatIWant;

Si vous souhaitez également vérifier si le caractère de soulignement (_) existe dans votre chaîne avant d'essayer de l'obtenir, vous pouvez utiliser les éléments suivants:

if (($pos = strpos($data, "_")) !== FALSE) { 
    $whatIWant = substr($data, $pos+1); 
}
247
databyss

strtok est une fonction négligée pour ce genre de chose. C'est censé être assez rapide.

$s = 233718_This_is_a_string;
$firstPart = strtok( $s, '_' );
$allTheRest = strtok( '' ); 

Une chaîne vide comme celle-ci force le retour du reste de la chaîne.

NB: s'il n'y avait rien après le '_', vous obtiendrez une valeur FALSE pour $allTheRest qui, comme indiqué dans documentation , doit être testée avec ===, afin de la distinguer des autres valeurs Falsey.

9
mike rodent

Voici la méthode en utilisant explode:

$text = explode('_', '233718_This_is_a_string', 2)[1]; // Returns This_is_a_string

ou:

$text = @end((explode('_', '233718_This_is_a_string', 2)));

En spécifiant 2 pour le paramètre limit dans explode() , il retourne un tableau avec 2 éléments maximum séparés par le délimiteur de chaîne. Le retour du 2e élément ([1]) donnera le reste de la chaîne.


Voici un autre one-liner en utilisant strpos (comme suggéré par @flu ):

$needle = '233718_This_is_a_string';
$text = substr($needle, (strpos($needle, '_') ?: -1) + 1); // Returns This_is_a_string
8
kenorb

si quelqu'un a besoin d'extraire la première partie de la chaîne, alors il peut essayer,

Requête:

$s = "This_is_a_string_233718";

$text = $s."_".substr($s, 0, strrpos($s, "_"));

Sortie:

This_is_a_string

1
Ady

Une autre façon simple, en utilisant strchr () ou strstr () :

$str = '233718_This_is_a_string';

echo ltrim(strstr($str, '_'), '_'); // This_is_a_string
0
nggit