คำตอบส่วนใหญ่ที่นี่ไม่ตอบส่วนที่แก้ไขฉันเดาว่ามันถูกเพิ่มก่อนหน้านี้ มันสามารถทำได้ด้วย regex เป็นหนึ่งคำตอบที่กล่าวถึง ฉันมีวิธีการที่แตกต่างกัน
ฟังก์ชันนี้ค้นหา $ string และค้นหาสตริงแรกระหว่าง $ start และ $ end string เริ่มต้นที่ตำแหน่ง $ offset จากนั้นอัปเดตตำแหน่ง $ offset ให้ชี้ไปที่จุดเริ่มต้นของผลลัพธ์ ถ้า $ includeDelimiters เป็นจริงมันจะรวมตัวคั่นในผลลัพธ์
หากไม่พบสตริง $ start หรือ $ end ก็จะส่งคืนค่าว่าง มันจะส่งกลับค่า null ถ้า $ string, $ start หรือ $ end เป็นสตริงว่าง
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