Получить строку между – Найти все вхождения PHP

Я нашел эту функцию, которая находит данные между двумя строками текста, html или любым другим.

Как его можно изменить, чтобы найти все вхождения? Каждая информация между каждым вхождением $ start [some-random-data] $ end. Я хочу, чтобы все [некоторые-случайные данные] документа (всегда будут разные данные).

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

Solutions Collecting From Web of "Получить строку между – Найти все вхождения PHP"

Один из возможных подходов:

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

Применение:

 $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 ) */ 

Демо .

Вы можете сделать это с помощью регулярного выражения:

 function getStringsBetween($string, $start, $end) { $pattern = sprintf( '/%s(.*?)%s/', preg_quote($start), preg_quote($end) ); preg_match_all($pattern, $string, $matches); return $matches[1]; } 

Я люблю использовать explode для получения строки между двумя строками. эта функция также работает для нескольких случаев.

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

Мне нужно было найти все эти вхождения между конкретным первым и последним тегом и каким-то образом изменить их и получить обратно измененную строку.

Поэтому я добавил этот небольшой код к подходу raina77ow после функции.

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

Теперь выходной образец удалил теги, и все строки между ними добавили номер следующим образом:

Один-1 aaa TwoTwo-2 Three Four-3 aaaaa Five-4

Но вы можете делать с ними что угодно. Может быть, может быть полезно кому-то.

Я также нуждался в тексте вне шаблона. Поэтому я немного изменил ответ от 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; } 

Применение:

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

дает:

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