Come ottenere tutto dopo un certo personaggio?


140

Ho una stringa e mi piacerebbe ottenere tutto dopo un certo valore. La stringa inizia sempre con un set di numeri e quindi un trattino basso. Vorrei ottenere il resto della stringa dopo il carattere di sottolineatura. Quindi, ad esempio, se ho le seguenti stringhe e ciò che vorrei restituito:

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

Come posso fare qualcosa del genere?

Risposte:


333

I strpos()reperti l'offset della sottolineatura, quindi substr afferra tutto da detto indice più 1, poi.

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

Se vuoi anche verificare se il carattere di sottolineatura ( _) esiste nella tua stringa prima di provare a ottenerlo, puoi usare quanto segue:

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

2
Quale sarebbe la cosa migliore da verificare se il carattere di sottolineatura esiste, ad es. È facoltativo.
John Magnolia,

2
@JohnMagnolia: Allora puoi semplicemente usareif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali,

11
@JohnMagnolia O un po 'di fantasia one-liner: substr($data, (strrpos($data, '_') ?: -1) +1).
influenza

2
@flu Penso che volessi dire, più difficile da leggere. IMO, meno righe non significa più elaborato.
MH,

Questa funzione restituirà la stringa dopo alcuni sottostringa / carattere o falso se l'ago non viene trovato:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor

14

strtokè una funzione trascurata per questo genere di cose. È pensato per essere abbastanza veloce.

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

Una stringa vuota come questa forzerà il resto della stringa da restituire.

NB se non ci fosse nulla dopo '_' si otterrebbe un FALSEvalore per il $allTheRestquale, come indicato nella documentazione , deve essere verificato con ===, per distinguere da altri valori falsi.


3
Fai attenzione: strtok restituirà la parte della stringa dopo il carattere se è il primo carattere nella stringa, ad esempio, strtok('a_b', '_')tornerà ama strtok('_b', '_')restituirà b, non una stringa vuota come ti aspetteresti
Quinn Comendant

9

Ecco il metodo 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)));

Specificando 2il limitparametro in explode(), restituisce un array con 2 elementi massimi separati dal delimitatore di stringa. Restituendo il secondo elemento ( [1]), fornirà il resto della stringa.


Ecco un altro one-liner usando strpos (come suggerito da @flu ):

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

2

se qualcuno ha bisogno di estrarre la prima parte della stringa, allora può provare,

Query:

$s = "This_is_a_string_233718";

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

Produzione:

This_is_a_string


2

Un altro modo semplice, usando strchr () o 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"

In una sola affermazione sarebbe.

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

0

Uso strrchr (). Ad esempio per trovare l'estensione di un file uso questa funzione:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.