Get string between - Find all occurrences PHP
I love to use explode to get string between two string. this function also works for multiple occurrences.
function GetIn($str,$start,$end){
$p1 = explode($start,$str);
for($i=1;$i<count($p1);$i++){
$p2 = explode($end,$p1[$i]);
$p[] = $p2[0];
}
return $p;
}
You can do this using regex:
function getStringsBetween($string, $start, $end)
{
$pattern = sprintf(
'/%s(.*?)%s/',
preg_quote($start),
preg_quote($end)
);
preg_match_all($pattern, $string, $matches);
return $matches[1];
}
I needed to find all these occurences between specific first and last tag and change them somehow and get back changed string.
So I added this small code to raina77ow approach after the function.
$sample = '<start>One<end> aaa <start>TwoTwo<end> Three <start>Four<end> aaaaa <start>Five<end>';
$sample_temp = getContents($sample, '<start>', '<end>');
$i = 1;
foreach($sample_temp as $value) {
$value2 = $value.'-'.$i; //there you can change the variable
$sample=str_replace('<start>'.$value.'<end>',$value2,$sample);
$i = ++$i;
}
echo $sample;
Now output sample has deleted tags and all strings between them has added number like this:
One-1 aaa TwoTwo-2 Three Four-3 aaaaa Five-4
But you can do whatever else with them. Maybe could be helpful for someone.
One possible approach:
function getContents($str, $startDelimiter, $endDelimiter) {
$contents = array();
$startDelimiterLength = strlen($startDelimiter);
$endDelimiterLength = strlen($endDelimiter);
$startFrom = $contentStart = $contentEnd = 0;
while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
$contentStart += $startDelimiterLength;
$contentEnd = strpos($str, $endDelimiter, $contentStart);
if (false === $contentEnd) {
break;
}
$contents[] = substr($str, $contentStart, $contentEnd - $contentStart);
$startFrom = $contentEnd + $endDelimiterLength;
}
return $contents;
}
Usage:
$sample = '<start>One<end>aaa<start>TwoTwo<end>Three<start>Four<end><start>Five<end>';
print_r( getContents($sample, '<start>', '<end>') );
/*
Array
(
[0] => One
[1] => TwoTwo
[2] => Four
[3] => Five
)
*/
Demo.