Die überwiegende Mehrheit der Antworten hier beantwortet den bearbeiteten Teil nicht, ich denke, sie wurden zuvor hinzugefügt. Es kann mit Regex gemacht werden, wie eine Antwort erwähnt. Ich hatte einen anderen Ansatz.
Diese Funktion durchsucht $ string und findet die erste Zeichenfolge zwischen $ start- und $ end-Zeichenfolgen, beginnend an der $ offset-Position. Anschließend wird die $ offset-Position aktualisiert, um auf den Anfang des Ergebnisses zu zeigen. Wenn $ includeDelimiters true ist, werden die Trennzeichen in das Ergebnis aufgenommen.
Wenn die Zeichenfolge $ start oder $ end nicht gefunden wird, wird null zurückgegeben. Es wird auch null zurückgegeben, wenn $ string, $ start oder $ end eine leere Zeichenfolge sind.
function str_between(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?string
{
if ($string === '' || $start === '' || $end === '') return null;
$startLength = strlen($start);
$endLength = strlen($end);
$startPos = strpos($string, $start, $offset);
if ($startPos === false) return null;
$endPos = strpos($string, $end, $startPos + $startLength);
if ($endPos === false) return null;
$length = $endPos - $startPos + ($includeDelimiters ? $endLength : -$startLength);
if (!$length) return '';
$offset = $startPos + ($includeDelimiters ? 0 : $startLength);
$result = substr($string, $offset, $length);
return ($result !== false ? $result : null);
}
Die folgende Funktion findet alle Zeichenfolgen, die zwischen zwei Zeichenfolgen liegen (keine Überlappungen). Es erfordert die vorherige Funktion und die Argumente sind dieselben. Nach der Ausführung zeigt $ offset auf den Anfang der zuletzt gefundenen Ergebniszeichenfolge.
function str_between_all(string $string, string $start, string $end, bool $includeDelimiters = false, int &$offset = 0): ?array
{
$strings = [];
$length = strlen($string);
while ($offset < $length)
{
$found = str_between($string, $start, $end, $includeDelimiters, $offset);
if ($found === null) break;
$strings[] = $found;
$offset += strlen($includeDelimiters ? $found : $start . $found . $end); // move offset to the end of the newfound string
}
return $strings;
}
Beispiele:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
gibt [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar 2', 'foo', 'bar')
gibt [' 1 ']
.
str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
gibt [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar', 'foo', 'foo')
gibt []
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
ist dies praktisch. laravel.com/docs/7.x/helpers#method-str-between