Sebagian besar jawaban di sini tidak menjawab bagian yang diedit, saya kira mereka ditambahkan sebelumnya. Ini dapat dilakukan dengan regex, seperti yang disebutkan dalam satu jawaban. Saya memiliki pendekatan yang berbeda.
Fungsi ini mencari $ string dan menemukan string pertama di antaranya $ start dan $ end string, mulai dari $ offset posisi. Kemudian memperbarui posisi $ ofset untuk menunjuk ke awal hasil. Jika $ includeDelimiters benar, itu termasuk pembatas dalam hasilnya.
Jika $ start atau $ end string tidak ditemukan, ia mengembalikan null. Ini juga mengembalikan null jika $ string, $ start, atau $ end adalah string kosong.
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);
}
Fungsi berikut menemukan semua string yang berada di antara dua string (tidak ada tumpang tindih). Ini membutuhkan fungsi sebelumnya, dan argumennya sama. Setelah eksekusi, $ offset poin ke awal dari string hasil yang terakhir ditemukan.
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;
}
Contoh:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
memberi [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar 2', 'foo', 'bar')
memberi [' 1 ']
.
str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
memberi [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar', 'foo', 'foo')
memberi []
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
nyaman. laravel.com/docs/7.x/helpers#method-str-between