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

Каков наилучший способ получить контент между двумя строками, например

ob_start(); include('externalfile.html'); ## see below $out = ob_get_contents(); ob_end_clean(); preg_match('/{FINDME}(.|\n*)+{\/FINDME}/',$out,$matches); $match = $matches[0]; echo $match; ## I have used .|\n* as it needs to check for new lines. Is this correct? ## externalfile.html {FINDME} Text Here {/FINDME} 

По какой-то причине это, похоже, работает на одном месте в моем коде, а не на другом. Я собираюсь сделать это правильно? Или есть лучший способ?

Также выводится буфер для этого или file_get_contents?

Заранее спасибо!

  • Используйте # вместо / поэтому вам не нужно их избегать.
  • Модификатор s делает . и \s также включают символы новой строки.
  • { и } имеет различные функциональные возможности, такие как от n до m раз в {n,m} .
  • Основа

     preg_match('#\\{FINDME\\}(.+)\\{/FINDME\\}#s',$out,$matches); 
  • Расширенный для различных тегов и т. Д. (Стиль не так хорош javascript).

     $delimiter = '#'; $startTag = '{FINDME}'; $endTag = '{/FINDME}'; $regex = $delimiter . preg_quote($startTag, $delimiter) . '(.*?)' . preg_quote($endTag, $delimiter) . $delimiter . 's'; preg_match($regex,$out,$matches); 

Поместите этот код в функцию

  • Для любого файла, который вы не хотите выполнять какой-либо stray php-код, вы должны использовать file_get_contents. include / require не должно быть даже вариантом.

Вы можете также использовать для этого substr и strpos.

 $startsAt = strpos($out, "{FINDME}") + strlen("{FINDME}"); $endsAt = strpos($out, "{/FINDME}", $startsAt); $result = substr($out, $startsAt, $endsAt - $startsAt); 

Вам нужно будет добавить проверку ошибок, чтобы обрабатывать случай, когда он не FINDME.

Мне нравятся эти два решения

 function GetBetween($content,$start,$end) { $r = explode($start, $content); if (isset($r[1])){ $r = explode($end, $r[1]); return $r[0]; } return ''; } function get_string_between($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); } 

Я также сделал несколько тестов с обоими решениями выше, и оба они дают почти то же самое время. Вы также можете проверить его. Я дал обеим функциям файл для чтения, который имел около 60000 символов (рассмотрен с подсчетом слова г-жи Word), и обе функции привели к тому, что они нашли около 0,000999 секунд.

 $startTime = microtime(true); GetBetween($str, '<start>', '<end>'); echo "Explodin Function took: ".(microtime(true) - $startTime) . " to finish<br />"; $startTime = microtime(true); get_string_between($str, '<start>', '<end>'); echo "Subsring Function took: ".(microtime(true) - $startTime) . " to finish<br />"; 

Разрывы строк могут вызвать проблемы в RegEx, попробуйте удалить или заменить их с помощью \ n перед обработкой.

 function getInbetweenStrings($start, $end, $str){ $matches = array(); $regex = "/$start([a-zA-Z0-9_]*)$end/"; preg_match_all($regex, $str, $matches); return $matches[1]; } $str = "C://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@"; $str_arr = getInbetweenStrings('@@', '@@', $str); print_r($str_arr); 

Это PHP-решение, которое возвращает строки, найденные между тегами в стоге сена. Он работает, но я не тестировал эффективность. Я нуждался в этом и был вдохновлен ответом Адама Райта на этой странице.

Возвращает массив (), содержащий все строки, найденные между $ tag и $ end_symbold. $ Tag в $ haystack, или FALSE, если не найден признак $ end_symbol. $, Поэтому в $ haystack нет пары тегов.

 function str_between_tags($haystack, $tag, $end_symbol){ $c_end_tags = substr_count($haystack, $end_symbol.$tag); if(!$c_end_tags) return FALSE; for($i=0; $i<$c_end_tags; $i++){ $p_s = strpos($haystack, $tag, (($p_e)?$p_e+strlen($end_symbol.$tag):NULL) ) + strlen($tag ); $p_e = strpos($haystack, $end_symbol.$tag, $p_s); $result[] = substr($haystack, $p_s, $p_e - $p_s); } return $result; } 

Быстрый способ поместить все в одну строку.

 $newlines = array("\t","\n","\r","\x20\x20","\0","\x0B"); $one_string = str_replace($newlines, "", html_entity_decode($content));