it-swarm.com.de

Teilen Sie Strings in PHP und holen Sie sich den letzten Teil

Ich muss einen String in PHP durch "-" teilen und den letzten Teil bekommen.

Also daraus:

abc-123-xyz-789

Ich erwarte zu bekommen

"789"

Dies ist der Code, den ich mir ausgedacht habe:

substr(strrchr($urlId, '-'), 1)

was gut funktioniert, außer:

Wenn meine Eingabezeichenfolge kein "-" enthält, muss ich die gesamte Zeichenfolge abrufen, z. B .:

123

Ich muss zurück

123

und es muss so schnell wie möglich sein. Jede Hilfe wird geschätzt!

36
Raphael Jeger

split($pattern,$string) Teilt Zeichenfolgen innerhalb eines bestimmten Musters oder Regex auf (es ist seit 5.3.0 veraltet)

preg_split($pattern,$string) Teilt Zeichenfolgen innerhalb eines bestimmten Regex-Musters

explode($pattern,$string) Teilt Zeichenfolgen innerhalb eines bestimmten Musters

end($arr) Letzten Array-Eintrag holen

So:

end(split('-',$str))

end(preg_split('/-/',$str))

$strArray = explode('-',$str)
$lastElement = end($strArray)

Liefert das letzte Element eines - getrennter String.


Und es gibt einen Hardcore-Weg, dies zu tun:

$str = '1-2-3-4-5';
echo substr($str, strrpos($str, '-') + 1);
//      |            '--- get the last position of '-' and add 1(if don't substr will get '-' too)
//      '----- get the last piece of string after the last occurrence of '-'
$string = 'abc-123-xyz-789';
$exploded = explode('-', $string);
echo end($exploded);

EDIT :: Endlich war es soweit, das E_STRICT-Problem zu beheben

19
Dale

Prüfen Sie einfach, ob das Begrenzungszeichen vorhanden ist oder nicht, und teilen Sie es oder tun Sie es nicht:

if (strpos($potentiallyDelimitedString, '-') !== FALSE) {
  found delimiter, so split
}
7
Grant Thomas

Wie bereits von anderen erwähnt, erhalten Sie die folgende Meldung, wenn Sie das Ergebnis von explode() keiner Variablen zuweisen:

E_STRICT: Strenge Standards: Nur Variablen sollten als Referenz übergeben werden

Der richtige Weg ist:

$words = explode('-', 'hello-world-123');
$id = array_pop($words); // 123
$slug = implode('-', $words); // hello-world
2
rybo111

Dieser Code wird das tun

<?php
$string = 'abc-123-xyz-789';
$output = explode("-",$string);
echo $output[count($output)-1];
?>
2
Infinity

Um die Anforderung zu erfüllen, dass "es muss so schnell wie möglich sein" Ich habe einen Benchmark mit einigen möglichen Lösungen durchgeführt. Jede Lösung musste diese Testfälle erfüllen.

$cases = [
    'aaa-zzz'                     => 'zzz',
    'zzz'                         => 'zzz',
    '-zzz'                        => 'zzz',
    'aaa-'                        => '',
    ''                            => '',
    'aaa-bbb-ccc-ddd-eee-fff-zzz' => 'zzz',
];

Hier sind die Lösungen:

function test_substr($str, $delimiter = '-') {
    $idx = strrpos($str, $delimiter);
    return $idx === false ? $str : substr($str, $idx + 1);
}

function test_end_index($str, $delimiter = '-') {
    $arr = explode($delimiter, $str);
    return $arr[count($arr) - 1];
}

function test_end_explode($str, $delimiter = '-') {
    $arr = explode($delimiter, $str);
    return end($arr);
}

function test_end_preg_split($str, $pattern = '/-/') {
    $arr = preg_split($pattern, $str);
    return end($arr);
}

Hier sind die Ergebnisse, nachdem jede Lösung 1.000.000 Mal mit den Testfällen verglichen wurde:

test_substr               : 1.706 sec
test_end_index            : 2.131 sec  +0.425 sec  +25%
test_end_explode          : 2.199 sec  +0.493 sec  +29%
test_end_preg_split       : 2.775 sec  +1.069 sec  +63%

Am schnellsten war es also, substr mit strpos zu verwenden. Beachten Sie, dass wir in dieser Lösung strpos auf false prüfen müssen, damit wir den vollständigen String zurückgeben können (Catering für den Fall zzz).

1
Luke Baulch

Gemäß dieser Beitrag :

end((explode('-', $string)));

dies wird keine E_STRICT Warnung in PHP 5 ( PHP magic ) auslösen Die Warnung wird in PHP 7 ausgegeben, daher kann das Hinzufügen von @ davor als Workaround verwendet werden.

0
kenorb

Da explode() ein Array zurückgibt, können Sie eckige Klammern direkt am Ende dieser Funktion einfügen, wenn Sie die Position des letzten Array-Elements kennen.

$email = '[email protected]';
$provider = explode('@', $email)[1];
echo $provider; // example.com

Oder ein anderer Weg ist list():

$email = '[email protected]';
list($prefix, $provider) = explode('@', $email);
echo $provider; // example.com

Wenn Sie die Position nicht kennen:

$path = 'one/two/three/four';
$dirs = explode('/', $path);
$last_dir = $dirs[count($dirs) - 1];
echo $last_dir; // four
0
rybo111