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?

user1048676
quelle

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); 
}
Daten
quelle
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.

Mike Nagetier
quelle
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
Kenorb
quelle
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

Ady
quelle
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"
Ali A. Dhillon
quelle
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"
Pinonirvana
quelle