Jak zdobyć wszystko po określonej postaci?

140

Mam ciąg znaków i chciałbym uzyskać wszystko po określonej wartości. Ciąg zawsze zaczyna się od zestawu liczb, a następnie podkreślenia. Chciałbym dostać resztę ciągu po podkreśleniu. Na przykład, jeśli mam następujące ciągi i chciałbym zwrócić:

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

Jak mogę zrobić coś takiego?

user1048676
źródło

Odpowiedzi:

333

Te strpos()znaleziska przesunięcie podkreślenia, następnie substr chwyta wszystko z tego indeksu oraz 1 roku.

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

Jeśli chcesz również sprawdzić, czy znak podkreślenia ( _) istnieje w twoim ciągu przed próbą jego uzyskania, możesz użyć następującego:

if (($pos = strpos($data, "_")) !== FALSE) { 
    $whatIWant = substr($data, $pos+1); 
}
databyss
źródło
2
Co by było najlepiej, co sprawdzić, czy istnieje podkreślenie, np. Jego opcjonalne.
John Magnolia,
2
@JohnMagnolia: W takim razie możesz po prostu użyćif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali,
11
@JohnMagnolia Albo trochę fantazyjne jeden-liner: substr($data, (strrpos($data, '_') ?: -1) +1).
grypa
2
@flu Myślę, że chciałeś powiedzieć, trudniej go przeczytać. IMO, mniej linii nie oznacza bardziej wyszukanego.
MH
Ta funkcja zwróci ciąg po jakimś podłańcuchu / znaku lub fałszu, jeśli igła nie zostanie znaleziona:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor
14

strtokjest pomijaną funkcją w tego typu sprawach. Ma to być dość szybkie.

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

Pusty ciąg, taki jak ten, wymusi zwrócenie reszty ciągu.

NB, jeśli po znaku „_” nie było nic, otrzymano by FALSEwartość, dla $allTheRestktórej, zgodnie z dokumentacją , należy przetestować ===, aby odróżnić ją od innych fałszywych wartości.

mike gryzoń
źródło
3
Bądź ostrożny: strtok zwraca część łańcucha po znaku, jeżeli jest to pierwszy znak w ciągu np strtok('a_b', '_')powróci aale strtok('_b', '_')wróci b, nie pusty ciąg jak można się spodziewać
Quinn Comendant
9

Oto metoda przy użyciu explode:

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

lub:

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

Określając 2dla limitparametru explode(), układ wraca z maksymalnie 2 elementów rozdzielonych przez ogranicznik łańcucha. Zwracając 2nd element ( [1]), zwróci resztę ciągu.


Oto kolejna jedna linijka za pomocą strpos(zgodnie z sugestią @flu ):

$needle = '233718_This_is_a_string';
$text = substr($needle, (strpos($needle, '_') ?: -1) + 1); // Returns This_is_a_string
kenorb
źródło
2

jeśli ktoś potrzebuje wyodrębnić pierwszą część ciągu, może spróbować,

Pytanie:

$s = "This_is_a_string_233718";

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

Wynik:

This_is_a_string

Ady
źródło
2

Inny prosty sposób, używając strchr () lub strstr () :

$str = '233718_This_is_a_string';

echo ltrim(strstr($str, '_'), '_'); // This_is_a_string
nggit
źródło
1
$string = "233718_This_is_a_string";
$withCharacter = strstr($string, '_'); // "_This_is_a_string"
echo substr($withCharacter, 1); // "This_is_a_string"

W jednym stwierdzeniu byłoby to.

echo substr(strstr("233718_This_is_a_string", '_'), 1); // "This_is_a_string"
Ali A. Dhillon
źródło
0

Używam strrchr (). Na przykład, aby znaleźć rozszerzenie pliku, używam tej funkcji:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Pinonirvana
źródło