Belirli bir karakterden sonra her şey nasıl elde edilir?


140

Bir ipim var ve belirli bir değerden sonra her şeyi almak istiyorum. Dize her zaman bir sayı kümesi ve ardından bir alt çizgi ile başlar. Alt çizgiden sonra dizenin geri kalanını almak istiyorum. Örneğin, aşağıdaki dizeleri varsa ve ben dönmek istiyorum ne varsa:

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

Böyle bir şeyi nasıl yapabilirim?

Yanıtlar:


333

Alt strpos()çizginin ofsetini bulur, sonra substr bu dizinden artı 1'den her şeyi alır.

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

Dizeyi _almayı denemeden önce alt çizgi karakterinin ( ) olup olmadığını da kontrol etmek istiyorsanız , aşağıdakileri kullanabilirsiniz:

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

2
Alt çizginin olup olmadığını kontrol etmek için en iyisi ne olacaktır, örneğin isteğe bağlı.
John Magnolia

2
@JohnMagnolia: O zaman sadece kullanabilirsinizif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali

11
@JohnMagnolia Veya biraz fantezi tek satırlık: substr($data, (strrpos($data, '_') ?: -1) +1).
grip

2
@flu Sanırım demek istediğini okumak daha zor. IMO, daha az satır meraklısı anlamına gelmez.
MH

İğne bulunmazsa bu işlev bazı alt dize / karakterlerden sonra dize döndürür veya false olur:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor

14

strtokbu tür şeyler için gözden kaçan bir işlevdir. Oldukça hızlı olması gerekiyor.

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

Bunun gibi boş dize, dizenin geri kalanını döndürülmeye zorlar.

Not: '_' den sonra hiçbir şey olmasaydı , dokümantasyonda belirtildiği gibi , diğer falsy değerlerinden ayırt etmek için === ile test edilmesi gereken bir FALSEdeğer elde edersiniz .$allTheRest


3
Dikkatli olun: strtok dizesinin bölümünü dönecektir sonra karakteri o dizisindeki ilk karakter ise, örneğin, strtok('a_b', '_')döner afakat strtok('_b', '_')dönecektir b, beklediğiniz gibi değil boş bir dize
Quinn Comendant

9

İşte yöntemi kullanarak explode:

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

veya:

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

Belirtilerek 2için limitparametre explode(), bu dizge ayraç ile ayrılan en fazla 2 elemanları ile bir dizi döner. 2. element ( [1]) döndürüldüğünde, dizenin geri kalan kısmı verilir.


İşte strpos( @flu tarafından önerildiği gibi ) kullanarak başka bir tek astar :

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

2

eğer birinin dizenin ilk kısmını çıkarması gerekiyorsa, deneyebilir,

Sorgu:

$s = "This_is_a_string_233718";

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

Çıktı:

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"

Tek bir açıklamada bu olurdu.

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

0

Strrchr () kullanıyorum. Örneğin bir dosyanın uzantısını bulmak için bu işlevi kullanıyorum:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.