Wie bekomme ich alles nach einem bestimmten Charakter?


140

Ich habe eine Zeichenfolge und möchte alles nach einem bestimmten Wert erhalten. Die Zeichenfolge beginnt immer mit einer Reihe von Zahlen und einem Unterstrich. Ich möchte den Rest der Zeichenfolge nach dem Unterstrich erhalten. Zum Beispiel, wenn ich die folgenden Zeichenfolgen habe und was ich zurückgeben möchte:

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

Wie kann ich so etwas tun?

Antworten:


333

Das strpos()findet den Versatz des Unterstrichs, dann erfasst substr alles ab diesem Index plus 1.

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

Wenn Sie auch überprüfen möchten, ob der Unterstrich ( _) in Ihrer Zeichenfolge vorhanden ist, bevor Sie versuchen, ihn abzurufen, können Sie Folgendes verwenden:

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

2
Was wäre das Beste, um zu überprüfen, ob der Unterstrich vorhanden ist, z. B. optional.
John Magnolia

2
@ JohnMagnolia: Dann können Sie einfach verwendenif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali

11
@ JohnMagnolia Oder ein kleiner schicker Einzeiler : substr($data, (strrpos($data, '_') ?: -1) +1).
Grippe

2
@flu Ich denke du wolltest sagen, schwerer zu lesen. IMO, weniger Zeilen bedeuten nicht schicker.
MH

Diese Funktion gibt einen String nach einem Teilstring / Char oder false zurück, wenn die Nadel nicht gefunden wird:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor

14

strtokist eine übersehene Funktion für diese Art von Dingen. Es soll ziemlich schnell sein.

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

Eine leere Zeichenfolge wie diese erzwingt die Rückgabe des restlichen Strings.

Hinweis: Wenn nach dem '_' überhaupt nichts mehr vorhanden ist, erhalten Sie einen FALSEWert, für $allTheRestden, wie in der Dokumentation angegeben , mit === getestet werden muss, um sich von anderen falschen Werten zu unterscheiden.


3
Seien Sie vorsichtig: strtok gibt den Teil der Zeichenfolge nach dem Zeichen zurück, wenn es das erste Zeichen in der Zeichenfolge ist, z. B. strtok('a_b', '_')wird zurückgegeben, aaber strtok('_b', '_')zurückgegeben b, keine leere Zeichenfolge, wie Sie es erwarten würden
Quinn Comendant

9

Hier ist die Methode mit explode:

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

oder:

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

Durch Angabe 2des limitParameters in explode()wird ein Array mit maximal 2 Elementen zurückgegeben, die durch den Zeichenfolgenbegrenzer getrennt sind. Wenn Sie das 2. Element ( [1]) zurückgeben, erhalten Sie den Rest der Zeichenfolge.


Hier ist ein weiterer Einzeiler mit strpos(wie von @flu vorgeschlagen ):

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

2

Wenn jemand den ersten Teil der Zeichenfolge extrahieren muss, kann er versuchen:

Abfrage:

$s = "This_is_a_string_233718";

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

Ausgabe:

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 einer einzigen Aussage wäre es.

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

0

Ich benutze strrchr (). Um zum Beispiel die Erweiterung einer Datei zu finden, benutze ich diese Funktion:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.