Comment tout obtenir après un certain personnage?

140

J'ai une chaîne et j'aimerais tout avoir après une certaine valeur. La chaîne commence toujours par un ensemble de nombres, puis un trait de soulignement. J'aimerais 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 je voudrais retourner:

"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?

utilisateur1048676
la source

Réponses:

332

La strpos()recherche le décalage du trait de soulignement, puis substr saisit tout à partir de cet index plus 1, à partir de.

$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 ce qui suit:

if (($pos = strpos($data, "_")) !== FALSE) { 
    $whatIWant = substr($data, $pos+1); 
}
databyss
la source
2
Quel serait le meilleur quoi vérifier si le trait de soulignement existe, par exemple, il est facultatif.
John Magnolia
2
@JohnMagnolia: Ensuite, vous pouvez simplement utiliserif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali
11
@JohnMagnolia Ou un peu de fantaisie one-liner: substr($data, (strrpos($data, '_') ?: -1) +1).
grippe
2
@flu Je pense que vous vouliez dire, plus difficile à lire. OMI, moins de lignes ne veut pas dire plus chic.
MH le
Cette fonction retournera une chaîne après une sous-chaîne / caractère ou false si l'aiguille n'est pas trouvée:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor
14

strtokest une fonction négligée pour ce genre de chose. Il est censé être assez rapide.

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

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

NB s'il n'y avait rien du tout après le '_' vous obtiendrez une FALSEvaleur pour $allTheRestlaquelle, comme indiqué dans la documentation , il faut tester avec ===, pour la distinguer des autres valeurs fausses.

Mike rongeur
la source
3
Attention: strtok retournera la partie de la chaîne après le caractère si c'est le premier caractère de la chaîne, par exemple, strtok('a_b', '_')retournera amais strtok('_b', '_')retournera b, pas une chaîne vide comme vous vous en
doutez
9

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 2le limitparamètre dans explode(), il renvoie un tableau avec 2 éléments maximum séparés par le délimiteur de chaîne. Renvoyer le 2ème é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
Kenorb
la source
2

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

Requete:

$s = "This_is_a_string_233718";

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

Production:

This_is_a_string

Ady
la source
2

Un autre moyen simple, en utilisant strchr () ou strstr () :

$str = '233718_This_is_a_string';

echo ltrim(strstr($str, '_'), '_'); // This_is_a_string
nggit
la source
1
$string = "233718_This_is_a_string";
$withCharacter = strstr($string, '_'); // "_This_is_a_string"
echo substr($withCharacter, 1); // "This_is_a_string"

En une seule déclaration, ce serait.

echo substr(strstr("233718_This_is_a_string", '_'), 1); // "This_is_a_string"
Ali A. Dhillon
la source
0

J'utilise strrchr (). Par exemple pour trouver l'extension d'un fichier, j'utilise cette fonction:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Pinonirvana
la source