Get line between - Find all occurrences of PHP

I found this function that finds data between two lines of text, HTML or something else.

How can this be changed to find all occurrences? Every data between every occurrence of $ start [some-random-data] $ end. I want the whole [some-random-data] document (it will always be different data).

function getStringBetween($string, $start, $end) { $string = " ".$string; $ini = strpos($string,$start); if ($ini == 0) return ""; $ini += strlen($start); $len = strpos($string,$end,$ini) - $ini; return substr($string,$ini,$len); } 
+12
php
Nov 22 '14 at 2:06
source share
6 answers

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; } 

Using:

 $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

+30
Nov 22 '14 at 14:19
source share

You can do this with 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]; } 
+7
Nov 22 '14 at 15:06
source share

I like to use explode to get a line between two lines. This feature 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; } 
+2
Jul 11 '17 at 11:22 on
source share

I needed to find all these occurrences between the specific first and last tag and somehow change them and return the changed string.

So, I added this little code to the 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 the tags are removed in the sample output, and all the lines between them have added a number as follows:

One-1 aaa TwoTwo-2 Three Four-3 aaaaa Five-4

But you can do anything with them. Maybe it can be useful to someone.

+1
Nov 29 '16 at 12:59
source share

I also needed text outside the template. So I slightly modified the answer from raina77ow:

 function get_delimited_strings($str, $startDelimiter, $endDelimiter) { $contents = array(); $startDelimiterLength = strlen($startDelimiter); $endDelimiterLength = strlen($endDelimiter); $startFrom = $contentStart = $contentEnd = $outStart = $outEnd = 0; while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) { $contentStart += $startDelimiterLength; $contentEnd = strpos($str, $endDelimiter, $contentStart); $outEnd = $contentStart - 1; if (false === $contentEnd) { break; } $contents['in'][] = substr($str, $contentStart, $contentEnd - $contentStart); $contents['out'][] = substr($str, $outStart, $outEnd - $outStart); $startFrom = $contentEnd + $endDelimiterLength; $outStart = $startFrom; } $contents['out'][] = substr($str, $outStart, $contentEnd - $outStart); return $contents; } 

Using:

  $str = "Bore layer thickness [2 mm] instead of [1,25 mm] with [0,1 mm] deviation."; $cas = get_delimited_strings($str, "[", "]"); 

gives:

 array(2) { ["in"]=> array(3) { [0]=> string(4) "2 mm" [1]=> string(7) "1,25 mm" [2]=> string(6) "0,1 mm" } ["out"]=> array(4) { [0]=> string(21) "Bore layer thickness " [1]=> string(12) " instead of " [2]=> string(6) " with " [3]=> string(10) " deviation" } } 
0
Aug 18 '16 at 14:28
source share

There were some great solutions here, but they were not ideal for extracting parts of the code, say, from HTML, which was my problem right now, since I need to extract script blocks from HTML before compressing HTML. So, based on the original @ raina77ow solution extended by @Cas Tuyn, I get the following:

 $test_strings = [ '0<p>a</p>1<p>b</p>2<p>c</p>3', '0<p>a</p>1<p>b</p>2<p>c</p>', '<p>a</p>1<p>b</p>2<p>c</p>3', '<p>a</p>1<p>b</p>2<p>c</p>', '<p></p>1<p>b' ]; /** * Seperate a block of code by sub blocks. Example, removing all <script>...<script> tags from HTML kode * * @param string $str, text block * @param string $startDelimiter, string to match for start of block to be extracted * @param string $endDelimiter, string to match for ending the block to be extracted * @return array [all full blocks, whats left of string] */ function getDelimitedStrings($str, $startDelimiter, $endDelimiter) { $contents = array(); $startDelimiterLength = strlen($startDelimiter); $endDelimiterLength = strlen($endDelimiter); $startFrom = $contentStart = $contentEnd = $outStart = $outEnd = 0; while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) { $contentStart += $startDelimiterLength; $contentEnd = strpos($str, $endDelimiter, $contentStart); $outEnd = $contentStart - 1; if (false === $contentEnd) { break; } $contents['in'][] = substr($str, ($contentStart-$startDelimiterLength), ($contentEnd + ($startDelimiterLength*2) +1) - $contentStart); if( $outStart ){ $contents['out'][] = substr($str, ($outStart+$startDelimiterLength+1), $outEnd - $outStart - ($startDelimiterLength*2)); } else if( ($outEnd - $outStart - ($startDelimiterLength-1)) > 0 ){ $contents['out'][] = substr($str, $outStart, $outEnd - $outStart - ($startDelimiterLength-1)); } $startFrom = $contentEnd + $endDelimiterLength; $startFrom = $contentEnd; $outStart = $startFrom; } $total_length = strlen($str); $current_position = $outStart + $startDelimiterLength + 1; if( $current_position < $total_length ) $contents['out'][] = substr($str, $current_position); return $contents; } foreach($test_strings AS $string){ var_dump( getDelimitedStrings($string, '<p>', '</p>') ); } 

This will extract everything

wlements with possible innerHTML aswell, giving this result:

 array (size=2) 'in' => array (size=3) 0 => string '<p>a</p>' (length=8) 1 => string '<p>b</p>' (length=8) 2 => string '<p>c</p>' (length=8) 'out' => array (size=4) 0 => string '0' (length=1) 1 => string '1' (length=1) 2 => string '2' (length=1) 3 => string '3' (length=1) array (size=2) 'in' => array (size=3) 0 => string '<p>a</p>' (length=8) 1 => string '<p>b</p>' (length=8) 2 => string '<p>c</p>' (length=8) 'out' => array (size=3) 0 => string '0' (length=1) 1 => string '1' (length=1) 2 => string '2' (length=1) array (size=2) 'in' => array (size=3) 0 => string '<p>a</p>' (length=8) 1 => string '<p>b</p>' (length=8) 2 => string '<p>c</p>' (length=8) 'out' => array (size=3) 0 => string '1' (length=1) 1 => string '2' (length=1) 2 => string '3' (length=1) array (size=2) 'in' => array (size=3) 0 => string '<p>a</p>' (length=8) 1 => string '<p>b</p>' (length=8) 2 => string '<p>c</p>' (length=8) 'out' => array (size=2) 0 => string '1' (length=1) 1 => string '2' (length=1) array (size=2) 'in' => array (size=1) 0 => string '<p></p>' (length=7) 'out' => array (size=1) 0 => string '1<p>b' (length=5) 

You can see the demo here: 3v4l.org/TQLmn

0
May 22 '19 at 21:56
source share



All Articles