Como conseguir tudo depois de um certo personagem?


140

Eu tenho uma string e gostaria de obter tudo depois de um certo valor. A string sempre começa com um conjunto de números e depois com um sublinhado. Eu gostaria de obter o resto da string após o sublinhado. Por exemplo, se eu tiver as seguintes seqüências de caracteres e o que gostaria de retornar:

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

Como posso fazer algo assim?

Respostas:


333

O strpos()encontra o deslocamento do sublinhado e, em seguida, o substr captura tudo desse índice mais 1, em diante.

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

Se você também quiser verificar se o caractere sublinhado ( _) existe na sua string antes de tentar obtê-lo, use o seguinte:

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

2
Qual seria o melhor para verificar se o sublinhado existe, por exemplo, é opcional.
John Magnolia

2
@JohnMagnolia: Então você pode apenas usarif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali

11
@JohnMagnolia Ou uma frase de fantasia pouco: substr($data, (strrpos($data, '_') ?: -1) +1).
gripe

2
@ Flu Acho que você quis dizer, mais difícil de ler. OMI, menos linhas não significa mais sofisticado.
MH

Esta função retornará string após alguma substring / char ou false se a agulha não for encontrada:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor 2/17/17

14

strtoké uma função esquecida para esse tipo de coisa. É para ser bastante rápido.

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

Seqüência vazia como essa forçará o restante da seqüência a ser retornada.

NB: se não houvesse nada após o '_', você obteria um FALSEvalor para$allTheRest qual, conforme declarado na documentação , deve ser testado com ===, para distinguir de outros valores falsos.


3
Tenha cuidado: strtok retornará a parte da cadeia após o personagem se ele é o primeiro caractere na seqüência, por exemplo, strtok('a_b', '_')vai voltar a, mas strtok('_b', '_')vai voltar b, não uma cadeia vazia como seria de esperar
Quinn Comendant

9

Aqui está o método usando 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)));

Ao especificar 2o limitparâmetro in explode(), ele retorna uma matriz com 2 elementos no máximo separados pelo delimitador de string. Retornar o 2º elemento ( [1]) dará o restante da string.


Aqui está outro one-liner usando strpos(como sugerido por @flu ):

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

2

se alguém precisar extrair a primeira parte da string, tente,

Inquerir:

$s = "This_is_a_string_233718";

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

Resultado:

This_is_a_string


2

Outra maneira simples, usando strchr () ou strstr () :

$str = '233718_This_is_a_string';

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

1
$string = "233718_This_is_a_string";
$withCharacter = strstr($string, '_'); // "_This_is_a_string"
echo substr($withCharacter, 1); // "This_is_a_string"

Em uma única afirmação seria.

echo substr(strstr("233718_This_is_a_string", '_'), 1); // "This_is_a_string"

0

Eu uso strrchr (). Por exemplo, para encontrar a extensão de um arquivo, eu uso esta função:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.