ob_get_contents () - получить данные из открытого тега тела, чтобы закрыть тег тела

0

Быстрый вопрос, есть ли способ указать, какое содержимое следует извлекать из 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) и сохранить его в файле. Сохранение файла работает.

Любая помощь будет оценена.

спасибо

  • 0
    Итак ... вам нужен HTML между <body> и </body> ?
  • 0
    @ JanosWeisz да .. это именно то, что мне нужно. На данный момент я получаю полную страницу ... от тега HTML до закрытия тега HTML
Теги:

3 ответа

1
Лучший ответ

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

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

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

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

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

  • 1
    Что если body <body id="tesT" onload="hello();"> или что-то подобное. На самом деле, издержки не так уж плохи, особенно если они используются для кэширования.
  • 0
    @DimitriAdamou Хороший улов. Я не знаю ни одного лайнера для этого. Причина, по которой я пытался избежать Regex, была из-за отсутствия его тега в вопросе.
Показать ещё 2 комментария
1

Простой,

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

print_r($custompage);
  • 0
    это дает мне массив
  • 0
    Да, и вы просто делаете $ custompage [0], это поведение preg_match. php.net/manual/en/function.preg-match.php Вы не можете сделать $string = preg_match(...); потому что preg_match возвращает либо 1, если есть совпадение, либо 0, если нет совпадений.
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);

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню