Каков наилучший способ получить контент между двумя строками, например
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);
Поместите этот код в функцию
Вы можете также использовать для этого 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));