У меня есть функция, которая извлекает содержимое между двумя строками. Я использую его для извлечения конкретной информации между тэгами html. Однако в настоящее время он работает, чтобы извлечь только первое совпадение, поэтому я хотел бы знать, можно ли улучшить его таким образом, чтобы извлечь все совпадения и предоставить их в массиве. Аналогично функции preg_match_all.
функция get_between ($ content, $ start, $ end) { $ r = explode ($ start, $ content); if (isset ($ r [1])) { $ r = explode ($ end, $ r [1]); return $ r [0]; } вернуть ''; }
Версия с рекурсией.
function get_between($content,$start,$end,$rest = array()){ $r = explode($start, $content, 2); if (isset($r[1])){ $r = explode($end, $r[1], 2); $rest[] = $r[0]; return get_between($r[1],$start,$end,$rest); } else { return $rest; } }
Версия с циклом.
function get_between($content,$start,$end){ $r = explode($start, $content); if (isset($r[1])){ array_shift($r); $ret = array(); foreach ($r as $one) { $one = explode($end,$one); $ret[] = $one[0]; } return $ret; } else { return array(); } }
Версия с array_map для PHP 5.2 и более ранних версий.
function get_between_help($end,$r){ $r = explode($end,$r); return $r[0]; } function get_between($content,$start,$end){ $r = explode($start, $content); if (isset($r[1])){ array_shift($r); $end = array_fill(0,count($r),$end); $r = array_map('get_between_help',$end,$r); return $r; } else { return array(); } }
Версия с array_map для PHP 5.3.
function get_between($content,$start,$end){ $r = explode($start, $content); if (isset($r[1])){ array_shift($r); $help_fun = function($arr) use ($end) { $r = explode($end,$arr); return $r[0]; }; $r = array_map($help_fun,$r); return $r; } else { return array(); } }