¿Cómo obtener todo después de cierto personaje?

140

Tengo una cadena y me gustaría obtener todo después de un cierto valor. La cadena siempre comienza con un conjunto de números y luego un guión bajo. Me gustaría obtener el resto de la cadena después del guión bajo. Entonces, por ejemplo, si tengo las siguientes cadenas y lo que me gustaría devolver:

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

¿Cómo puedo hacer algo como esto?

usuario1048676
fuente

Respuestas:

333

Los strpos()hallazgos del offset del guión, a continuación, substr agarra todo, desde que el índice más 1, en adelante.

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

Si también desea verificar si el carácter de subrayado ( _) existe en su cadena antes de intentar obtenerlo, puede usar lo siguiente:

if (($pos = strpos($data, "_")) !== FALSE) { 
    $whatIWant = substr($data, $pos+1); 
}
databyss
fuente
2
¿Cuál sería el mejor qué comprobar si existe el guión bajo, por ejemplo, es opcional?
John Magnolia
2
@JohnMagnolia: Entonces puedes usarif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali
11
@JohnMagnolia O un poco de fantasía de una sola línea: substr($data, (strrpos($data, '_') ?: -1) +1).
gripe
2
@flu Creo que querías decir, más difícil de leer. OMI, menos líneas no significa más elegante.
MH
Esta función devolverá la cadena después de alguna subcadena / char o false si no se encuentra la aguja:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor
14

strtokes una función pasada por alto para este tipo de cosas. Está destinado a ser bastante rápido.

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

Una cadena vacía como esta obligará a devolver el resto de la cadena.

Nota: si no hubiera nada después del '_', obtendría un FALSEvalor para el $allTheRestcual, como se indica en la documentación , debe probarse con ===, para distinguirlo de otros valores falsos.

Mike roedor
fuente
3
Tenga cuidado: strtok devolverá la parte de la cadena después del carácter si es el primer carácter de la cadena, por ejemplo, strtok('a_b', '_')regresará apero strtok('_b', '_')no regresará b, no una cadena vacía como era de esperar
Quinn Comendant
9

Aquí está el método usando explode:

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

o:

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

Al especificar 2el limitparámetro en explode(), devuelve una matriz con 2 elementos máximos separados por el delimitador de cadena. Volviendo el segundo elemento ( [1]), dará el resto de la cadena.


Aquí hay otro one-liner usando strpos(como lo sugiere @flu ):

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

si alguien necesita extraer la primera parte de la cadena, puede intentarlo,

Consulta:

$s = "This_is_a_string_233718";

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

Salida:

This_is_a_string

Ady
fuente
2

Otra forma simple, usando strchr () o strstr () :

$str = '233718_This_is_a_string';

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

En una sola declaración sería.

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

Yo uso strrchr (). Por ejemplo, para encontrar la extensión de un archivo, uso esta función:

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