여기에있는 대부분의 답변은 편집 된 부분에 대한 답변이 아닙니다. 하나의 답변에서 언급했듯이 정규 표현식으로 수행 할 수 있습니다. 나는 다른 접근법을 가지고있었습니다.
이 함수는 $ string을 검색 하여 $ offset 위치에서 시작하여 $ start와 $ end 문자열 사이 의 첫 번째 문자열을 찾습니다 . 그런 다음 $ offset 위치를 업데이트하여 결과의 시작을 가리 킵니다. $ includeDelimiters가 true이면 결과에 구분자가 포함됩니다.
$ start 또는 $ end 문자열이 없으면 null을 반환합니다. $ string, $ start 또는 $ end가 빈 문자열이면 null도 반환합니다.
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);
}
다음 함수는 두 문자열 사이에있는 모든 문자열을 찾습니다 (중복 없음). 이전 함수가 필요하며 인수는 동일합니다. 실행 후 $ offset은 마지막으로 찾은 결과 문자열의 시작을 가리 킵니다.
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;
}
예 :
str_between_all('foo 1 bar 2 foo 3 bar', 'foo', 'bar')
제공합니다 [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar 2', 'foo', 'bar')
제공합니다 [' 1 ']
.
str_between_all('foo 1 foo 2 foo 3 foo', 'foo', 'foo')
제공합니다 [' 1 ', ' 3 ']
.
str_between_all('foo 1 bar', 'foo', 'foo')
제공합니다 []
.
\Illuminate\Support\Str::between('This is my name', 'This', 'name');
편리합니다. laravel.com/docs/7.x/helpers#method-str-between