Получить контент между двумя строками 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?
Спасибо заранее!
Ответы
Ответ 1
- Используйте
#
вместо /
, поэтому вам не нужно их избегать.
- modifier
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 не должно даже быть вариантом там.
Ответ 2
Вы можете также использовать для этого substr и strpos.
$startsAt = strpos($out, "{FINDME}") + strlen("{FINDME}");
$endsAt = strpos($out, "{/FINDME}", $startsAt);
$result = substr($out, $startsAt, $endsAt - $startsAt);
Вам нужно будет добавить проверку ошибок, чтобы обрабатывать случай, когда он не FINDME.
Ответ 3
Мне нравятся эти два решения
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 />";
Ответ 4
Разрывы строк могут вызвать проблемы в RegEx, попробуйте удалить или заменить их с помощью \n перед обработкой.
Ответ 5
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://@@[email protected]@/@@[email protected]@/@@[email protected]@";
$str_arr = getInbetweenStrings('@@', '@@', $str);
print_r($str_arr);
Ответ 6
Это 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;
}
Ответ 7
Быстрый способ разместить все в одну строку.
$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$one_string = str_replace($newlines, "", html_entity_decode($content));