Phần lớn câu trả lời ở đây không trả lời phần đã chỉnh sửa, tôi đoán chúng đã được thêm vào trước đó. Nó có thể được thực hiện với regex, như một câu trả lời đề cập. Tôi đã có một cách tiếp cận khác.
Hàm này tìm kiếm chuỗi $ và tìm chuỗi đầu tiên giữa chuỗi $ start và $ end, bắt đầu từ vị trí $ offset. Sau đó, nó cập nhật vị trí $ offset để chỉ đến điểm bắt đầu của kết quả. Nếu $ includeD Friiter là đúng, nó bao gồm các dấu phân cách trong kết quả.
Nếu không tìm thấy chuỗi $ start hoặc $ end, nó sẽ trả về null. Nó cũng trả về null nếu $ string, $ start hoặc $ end là một chuỗi rỗng.
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);
}
Hàm sau tìm thấy tất cả các chuỗi nằm giữa hai chuỗi (không trùng lặp). Nó đòi hỏi hàm trước và các đối số là như nhau. Sau khi thực hiện, $ offset trỏ đến đầu chuỗi kết quả tìm thấy cuối cùng.
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;
}
Ví dụ:
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
cho [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar 2', 'foo', 'bar')
cho [' 1 ']
.
str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
cho [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar', 'foo', 'foo')
cho []
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
thật tiện lợi. laravel.com/docs/7.x/helpers#method-str-b between