Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вырезать все между <body ...>...</body>

2.0K
01 сентября 2007 года
calgon
90 / / 27.06.2006
Здрасте, всем!
Нужно вырезать все что находится между тегами <body ....>....</body>
Использовал выражение :
 
Код:
preg_match('/\<body [^\>]?\>(.*?)\<\/body\s*\>/si', $html, $out);

Проверял на таком коде :
<html>
<head>
<title>Some title</title>
<meta name="description" content="descss,sd fsdfs ,df f">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Pragma" content="no-cache">
<meta name="keywords" content="some text, @sdff, Some">
<link rel="stylesheet" href="/main.css" type="text/css">
<style type="text/css">body {
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
</style></head>

<body bgcolor="#FFFFFF" text="#000000" onLoad="document.form1.java.value=1;">
<div align="center">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="0%" height="85" align="right"><p><img src="/images/logo.gif" width="130" height="75" border="0" alt="Some" /></p></td>
<td width="100%"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="100%" height="65" align="center" valign="top">
<p>sdf
</p>
</td>
<td width="0%" valign="top"><p><img src="/images/x.gif" width="60" height="1" /></p>
</body>
</html>

Не пашет. :(
355
01 сентября 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
 
Код:
<?php
   
    $src = "<html> asdsad ad <body color=\"blue\">asdldkf<h1>sdddd</h1>ader</body></html> asd<body>asd</body>";
    echo preg_match("/<body.*?>(.*?)<\/body>/", $src, $match);
    print_r($match);
?>
2.0K
01 сентября 2007 года
calgon
90 / / 27.06.2006
[QUOTE=<SCORP>;209145]
 
Код:
<?php
   
    $src = "<html> asdsad ad <body color=\"blue\">asdldkf<h1>sdddd</h1>ader</body></html> asd<body>asd</body>";
    echo preg_match("/<body.*?>(.*?)<\/body>/", $src, $match);
    print_r($match);
?>
[/QUOTE]
этот не пашет, т.к. <body> у меня идет с параметрами :
<body bgcolor="#FFFFFF" text="#000000" onLoad="document.form1.java.value=1;">
353
01 сентября 2007 года
Nixus
840 / / 04.01.2007
Вообще-то пашет. Может проблема не в открывающемся <body> ?
А вообще правильнее писать так:
 
Код:
<?php
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>

или так:
 
Код:
<?php
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>

в зависимости от конкретности задачи.
2.0K
01 сентября 2007 года
calgon
90 / / 27.06.2006
Цитата: Nixus
Вообще-то пашет. Может проблема не в открывающемся <body> ?
А вообще правильнее писать так:
 
Код:
<?php
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>

или так:
 
Код:
<?php
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>

в зависимости от конкретности задачи.



ни 1-е ни 2-е не пашут. если подставить мой хтмл-код, то результатом является повторение сорца, т.е. :
<html>
......
</html>
<html>
.....
</html>

353
01 сентября 2007 года
Nixus
840 / / 04.01.2007
Что у тебя за код? И что за версия PHP?
2.0K
01 сентября 2007 года
calgon
90 / / 27.06.2006
Цитата: Nixus
Что у тебя за код? И что за версия PHP?


Код :

Код:
$original_html = '<html>
<head>
<title>Some title</title>
<meta name="description" content="descss,sd fsdfs ,df f">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Pragma" content="no-cache">
<meta name="keywords" content="some text, @sdff, Some">
<link rel="stylesheet" href="/main.css" type="text/css">
<style type="text/css">body {
    margin-left: 0px;
    margin-top: 0px;
    margin-right: 0px;
    margin-bottom: 0px;
}
</style></head>

<body bgcolor="#FFFFFF" text="#000000" &#111;&#110;Load="document.form1.java.value=1;">
<div align="center">
  <table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="0%" height="85" align="right"><p><img src="/images/logo.gif" width="130" height="75" border="0" alt="Some" /></p></td>
    <td width="100%"><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td width="100%" height="65" align="center" valign="top">
    <p>sdf 
    </p>
    </td>
        <td width="0%" valign="top"><p><img src="/images/x.gif" width="60" height="1" /></p>
</body>
</html>'
;
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $original_html);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/", '$1', $res);
echo $res;


PHP 5.2.3
353
01 сентября 2007 года
Nixus
840 / / 04.01.2007
Косяк за мной. Забыл si в конце РВ.
 
Код:
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/si", '', $original_html);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/si", '$1', $res);
echo $res;
2.0K
01 сентября 2007 года
calgon
90 / / 27.06.2006
Цитата: Nixus
Косяк за мной. Забыл si в конце РВ.
 
Код:
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/si", '', $original_html);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/si", '$1', $res);
echo $res;



о! работает. пасиб большое. :)

12
02 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Ну как большой любитель cтека XML не могу остаться в стороне, тем более было любопытно выяснить на сколько DOM медленее регулярок (поднимали такой вопрос на форуме).

Для данной задачи очень бы пошло свойство innerHTML из JavaScript, но к сожелению в PHP минимальный уровень DOM соотвествует Level 3, а innerHTML из Level 0. (для тех кто не знает уровни деления читать тут: DOM ). Но руки есть, голова тоже поэтому пишу расширение.
Листинг файла DOMDocumentL0.php:
Код:
<?php
/*
    Класс DOMDocumentL0 призван расширить методы к.DOMDocument (API DOM Level 3)
    до уровня DOM Level 0. Предназначен для работы с HTML и XML документами.
    Может использоваться для частичного преобразования HTML->XHTML: закрывает
    все открытие теги у которых нет конечного тега (p, li и др.), переводит
    имена тегов и атрибутов в нижний регистр, значения всех атрибутов заключаются
    в двойные кавычки.

    @category   DOM
    @version    0.2
    @author 'Sundukov Alexey' <public-mail@alekciy.ru>
    @copyright  Copyright (c) 2007 alekciy (http://alekciy.ru)
*/

class DOMDocumentL0 extends DOMDocument
{

    //XPath объект созданный для загружаемого документа
    public $XPath = null;

    public function loadHTML($str_HTML)
    {
        /*
        Метод расширяет DOMDocument->loadHTML автоматически создавая XPath объект.
        bool loadHTML (str $str_HTML)

        $str_HTML - строка с HTML кодом.
        */

        if(parent::loadHTML($str_HTML))
        {
            $this->XPath = new DOMXPath($this);
            return true;
        }
        else
        {
            return false;
        };
    }

    public function loadHTMLFile($str_fileHTML)
    {
        /*
        Метод расширяет DOMDocument->loadHTMLFile автоматически создавая XPath объект.
        bool loadHTML (str $str_fileHTML)

        $str_fileHTML - путь до файла с HTML кодом.
        */

        if(parent::loadHTMLFile($str_HTML))
        {
            $this->XPath = new DOMXPath($this);
            return true;
        }
        else
        {
            return false;
        };
    }

    public function loadXML($str_XML)
    {
        /*
        Метод расширяет DOMDocument->loadXML автоматически создавая XPath объект.
        bool loadXML (str $str_XML)

        $str_XML - строка с XML кодом.
        */

        if(parent::loadXML($str_XML))
        {
            $this->XPath = new DOMXPath($this);
            return true;
        }
        else
        {
            return false;
        };
    }

    private function drawHTML($element, $add_self = false)
    {
        /*
        Для объекта $element получить HTML код содержащийся в нем.
        str drawHTML(obj $element[, bln $add_self])

        $element - объект типа DOMNode;
        $add_self - добавить ли сам элемент в возращаемое значение.
        */


        $content = '';

        switch ($element->nodeType)
        {

            case 1:
                $tag_name = $element->nodeName;
                if ($element->hasAttributes())
                {
                    $attributes = '';
                    $DOMNodeList = $this->XPath->query('./attribute::*',$element);
                    foreach ($DOMNodeList as $DOMAttr)
                    {
                        $attributes .= ' '.$DOMAttr->name.'="'.$DOMAttr->value.'"';
                    };
                }
                else
                {
                    $attributes = '';
                };
                if ($element->hasChildNodes())
                {
                    $childNodes = $element->childNodes;
                    foreach ($childNodes as $val)
                    {
                        $content .= $this->drawHTML($val,true);
                    };
                }
                else
                {
                    $content = $element->textContent;
                };

                if ($add_self)
                {
                    if ($content == '')
                    {
                        return "<{$tag_name}{$attributes} />";
                    }
                    else
                    {
                        return "<{$tag_name}{$attributes}>{$content}</{$tag_name}>";
                    };
                }
                else
                {
                    return $content;
                };
            break;

            case 2:
                return null;
            break;

            case 3:
                return $content = $element->textContent;
            break;

            case 4:
                return null;
            break;

            case 5:
                return null;
            break;

            case 6:
                return null;
            break;

            case 7:
                return "<?{$element->target} {$element->data}>" ;
            break;

            case 8:
                return '<!--'.$content = $element->textContent.'-->';
            break;

            case 9:
                return null;
            break;

            case 10:
                return "<!DOCTYPE {$element->name} PUBLIC \"{$element->publicId}\" \"{$element->systemId}\">";
            break;

            case 11:
                return null;
            break;

            case 12:
                return null;
            break;

            case 13:
                if ($element->hasChildNodes())
                {
                    $DOMNodeList = $element->childNodes;
                    $type = array(1 => array(), 7 => array(), 10 => array());
                    foreach ($DOMNodeList as $Node)
                    {
                        $type[$Node->nodeType][] = $Node;
                    };

                    foreach ($type[7] as $val)
                    {
                        $content .= $this->drawHTML($val);
                    };

                    foreach ($type[10] as $val)
                    {
                        $content .= $this->drawHTML($val);
                    };

                    foreach ($type[1] as $val)
                    {
                        $content .= $this->drawHTML($val,true);
                    };

                    return $content;
                };
            break;

            case 14:
                return null;
            break;

            case 15:
                return null;
            break;

            case 16:
                return null;
            break;

            case 17:
                return null;
            break;

            case 18:
                return null;
            break;
        };
        return true;
    }

    public function innerHTML($element, $add_self = false)
    {
        /*
        Содержимое тега в виде HTML кода.
        str innerHTML(obj $element[, bln $add_self])

        $element - объект типа DOMNode для которого нужно получить код;
        $add_self - добавить ли сам элемент в возращаемое значение.
        */

        if ($element->nodeType == null) {return null;};
        return $this->drawHTML($element, $add_self);
    }
};

Теперь как воспользоваться классом:
 
Код:
<?php
include_once('DOMDocumentL0.php');
$doc = new DOMDocumentL0();
$doc->loadHTML($original_html);
$bode = $doc->XPath->query('/html/body')->item(0);
echo $doc->innerHTML($bode);


Результаты: Я провел ряд тестов. Делась группа тестов, в одно группе производилось 60 запросов к скрипту в течении одной минуты. Для исключения случаных фактов запросы к скрипта по методу DOM и методу регулярной делались одновременно. Результат этих 60 запросов усреднялся. Я сделал 3 группы (180 запросов) и получается так, что в данной ситуации регулярки работают быстрее в ~10 раз быстрее. Если регулярка справляется с задачей порядка 0,5 мсек, то через DOM ~5 мсек.

Поэтому если для некоего проекта эти микросекунды критичны, то выбор однозначно в сторону регулярок. Если же нужна гибкость, то я бы предпочел DOM. Потому что можно использовать XPath выражения, что по написанию гораздо понятнее чем регулярки (к примеру если у элемента в дереве есть id=id_element, то получить его содержимое в виде HTML можно будет просто query('id("id_element")')). Кроме того через DOM можно получить из HTML->XHTML ибо он закроет все теги, приведет имена в нижний регистр.
12
07 октября 2007 года
alekciy
3.0K / / 13.12.2005
В свете вот этой темы: http://forum.codenet.ru/showthread.php?p=214136 немного дописал класс. Теперь можно использовать и с XML.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог