La stragrande maggioranza delle risposte qui non risponde alla parte modificata, immagino che siano state aggiunte prima. Può essere fatto con regex, come menziona una risposta. Ho avuto un approccio diverso.
Questa funzione cerca $ string e trova la prima stringa tra $ start e $ end stringhe, iniziando dalla posizione $ offset. Quindi aggiorna la posizione $ offset in modo che punti all'inizio del risultato. Se $ includeDelimiters è true, include i delimitatori nel risultato.
Se la stringa $ start o $ end non viene trovata, restituisce null. Restituisce inoltre null se $ stringa, $ inizio o $ fine sono una stringa vuota.
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);
}
La seguente funzione trova tutte le stringhe che si trovano tra due stringhe (senza sovrapposizioni). Richiede la funzione precedente e gli argomenti sono gli stessi. Dopo l'esecuzione, $ offset punta all'inizio dell'ultima stringa di risultati trovata.
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;
}
Esempi:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
dà [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar 2', 'foo', 'bar')
dà [' 1 ']
.
str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
dà [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar', 'foo', 'foo')
dà []
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
è conveniente. laravel.com/docs/7.x/helpers#method-str-between