2014-12-07 4 views
0

Быстрый вопрос, есть ли способ точно указать, какое содержимое следует извлекать из ob_get_contents() в php.ob_get_contents() - получить данные из тега тега тела тела, чтобы закрыть тег тела

У меня есть следующий код .. но до сих пор нет удачи ..

$no = mt_rand(100,10000);  
$page = ob_get_contents(); 
$custompage = preg_match('/<body[^>]+./','', $page); 
ob_end_clean(); 

$filename1 = $no.'doc.html'; 

$f = fopen('./view/'.$filename1, "w"); 
fwrite($f, $custompage); 
fclose($f);  

То, что я хочу, чтобы выбрать только HTML сгенерированных из PHP сценария (между тегами тела) и сохранить его в файл. Сохранение файла работает.

Любая помощь, будем очень благодарны.

Спасибо

+0

Итак, вам нужен HTML-код между '' и' '? –

+0

@ JánosWeisz да .. это именно то, что мне нужно. На данный момент я получаю полную страницу ... от тега html до закрытия html-тега – rob

ответ

1

Regex может быть излишним для решения этой задачи. Логично предположить, что у вас есть ровно один <body> и одна подстрока </body> на вашей выводимой странице.

Все, что мы должны сделать в этом случае заключается в определении позиции строки из этих двух, и огня вверх substr:

$from = strpos($page, '<body>'); 
$to = strpos($page, '</body>'); 

$contents = substr($page, $from, $to - $from); 

Это, однако, включают в себя <body> и </body> тегов.

+1

Что делать, если тело '' или так далее. На самом деле, накладные расходы не так уж плохи, особенно если они используются для кеширования – DdD

+0

@DimitriAdamou Хороший улов. Для этого я не знаю ни одного лайнера. Причина, по которой я пыталась избежать Regex, была связана с отсутствием его тега в вопросе. –

+2

Просто отбросьте конечный '>' из исходного 'from' и @ DimitriAdamou случае должно быть выполнено. – rfoo

1

простой,

$match = ""; 
preg_match("/<body.+<\/body>/is", $page, $custompage); 

print_r($custompage); 
+0

это дает мне массив – rob

+0

Да, и вы просто делаете $ custompage [0], то есть поведение preg_match. http://php.net/manual/en/function.preg-match.php Вы не можете выполнить '$ string = preg_match (...); 'потому что preg_match возвращает либо 1, если есть совпадение, либо 0, если нет совпадений. – DdD

0

Вы можете сделать это с помощью DOM API:

Просто загрузите вашу страницу код так:

$dom = new DOMDocument(); 
$dom->loadHTML($page); 

Затем Извлекает тело «узел» (как есть только один элемент тела, мы можем использовать item(0)):

$body = $dom->getElementsByTagName('body')->item(0); 

Тогда вы можете вывести тело в канонизированный форме:

echo $body->C14N(); 

или просто выводим код тела XML таким образом:

echo $dom->saveXML($body); 

Просто используйте file_put_contents, чтобы сохранить его там, где вы хотите, чтобы ваш код может быть просто:

$dom = new DOMDocument(); 
$dom->loadHTML($page); 
file_put_contents(
    "myfile.html", 
    $dom->getElementsByTagName('body')->item(0)->C14N() 
); 

Это будет держать body элемент потому что документ DOM должен иметь корень, но вы можете избавиться от него, сохраняя каждый дочерний узел:

$dom = new DOMDocument(); 
$dom->loadHTML($page); 
$content = ""; 
foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $child) { 
    $content .= $dom->saveXML($child); 
} 
file_put_contents("myfile.html", $content); 

Существует немного больше кода, чем в других решениях, но, по моему мнению, это гораздо более чисто, чтобы сделать это таким образом.

Смежные вопросы