Быстрый вопрос, есть ли способ указать, какое содержимое следует извлекать из ob_get_contents() в php.
У меня есть следующий код.. но все равно не повезло..
$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-скрипта (между тегом body) и сохранить его в файле. Сохранение файла работает.
Любая помощь будет оценена.
спасибо
Regex может быть излишним для этой задачи. Логично предположить, что на вашей выводимой странице имеется ровно одна <body>
и одна </body>
подстрока.
Все, что мы должны сделать в этом случае, это определение строковой позиции этих двух и substr
:
$from = strpos($page, '<body>');
$to = strpos($page, '</body>');
$contents = substr($page, $from, $to - $from);
Это, однако, будет включать теги <body>
и </body>
.
<body id="tesT" onload="hello();">
или что-то подобное. На самом деле, издержки не так уж плохи, особенно если они используются для кэширования.
Простой,
$match = "";
preg_match("/<body.+<\/body>/is", $page, $custompage);
print_r($custompage);
$string = preg_match(...);
потому что preg_match возвращает либо 1, если есть совпадение, либо 0, если нет совпадений.
Вы можете сделать это через API DOM:
Просто загрузите код страницы таким образом:
$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);
Есть немного больше кода, чем в других решениях, но, по моему мнению, это гораздо более чисто, чтобы сделать это таким образом.
<body>
и</body>
?