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?

pengguna1048676
sumber

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); 
}
databyss
sumber
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.

mike rodent
sumber
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
kenorb
sumber
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

Ady
sumber
2

Cara sederhana lain, menggunakan strchr () atau strstr () :

$str = '233718_This_is_a_string';

echo ltrim(strstr($str, '_'), '_'); // This_is_a_string
nggit
sumber
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"
Ali A. Dhillon
sumber
0

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

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