Bagaimana cara mendapatkan semuanya setelah karakter tertentu?


140

Saya punya string dan saya ingin mendapatkan semuanya setelah nilai tertentu. String selalu dimulai dengan satu set angka dan kemudian garis bawah. Saya ingin mendapatkan sisa string setelah garis bawah. Jadi misalnya jika saya memiliki string berikut dan apa yang ingin saya kembalikan:

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

Bagaimana saya bisa melakukan sesuatu seperti ini?

Jawaban:


333

The strpos()temuan offset garis bawah, kemudian substr meraih segala sesuatu dari indeks ditambah 1, dan seterusnya.

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

Jika Anda juga ingin memeriksa apakah karakter garis bawah ( _) ada di string Anda sebelum mencoba mendapatkannya, Anda dapat menggunakan yang berikut ini:

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

2
Apa yang terbaik untuk memeriksa apakah garis bawah itu ada, misalnya opsional.
John Magnolia

2
@ JohnMagnolia: Maka Anda bisa menggunakanif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali

11
@JohnMagnolia Atau sedikit mewah satu-liner: substr($data, (strrpos($data, '_') ?: -1) +1).
Flu

2
@ Fllu Saya pikir Anda bermaksud mengatakan, lebih sulit untuk dibaca. IMO, lebih sedikit garis tidak berarti lebih bagus.
MH

Fungsi ini akan mengembalikan string setelah beberapa substring / char atau false jika jarum tidak ditemukan:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor

14

strtokadalah fungsi yang diabaikan untuk hal semacam ini. Ini dimaksudkan untuk menjadi sangat cepat.

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

String kosong seperti ini akan memaksa sisa string dikembalikan.

NB jika tidak ada sama sekali setelah '_' Anda akan mendapatkan FALSEnilai $allTheRestyang, sebagaimana dinyatakan dalam dokumentasi , harus diuji dengan ===, untuk membedakan dari nilai-nilai palsu lainnya.


3
Hati-hati: strtok akan mengembalikan bagian dari string setelah karakter jika itu adalah karakter pertama dalam string, misalnya, strtok('a_b', '_')akan kembali atetapi strtok('_b', '_')akan kembali b, bukan string kosong seperti yang Anda harapkan
Quinn Comendant

9

Inilah metode dengan menggunakan explode:

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

atau:

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

Dengan menentukan 2untuk limitparameter dalam explode(), ia mengembalikan array dengan 2 elemen maksimum dipisahkan oleh pembatas tali. Mengembalikan elemen ke-2 ( [1]), akan memberikan sisa string.


Berikut ini adalah satu-liner lainnya dengan menggunakan strpos(seperti yang disarankan oleh @flu ):

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

2

jika ada yang perlu mengekstraksi bagian pertama dari string maka dapat mencoba,

Pertanyaan:

$s = "This_is_a_string_233718";

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

Keluaran:

This_is_a_string


2

Cara sederhana lain, menggunakan strchr () atau 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"

Dalam satu pernyataan saja.

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

0

Saya menggunakan strrchr (). Misalnya untuk menemukan ekstensi file saya menggunakan fungsi ini:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.