<?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);
?>
Вырезать все между <body ...>...</body>
Нужно вырезать все что находится между тегами <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>
Не пашет. :(
Код:
Код:
<?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);
?>
$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);
?>
этот не пашет, т.к. <body> у меня идет с параметрами :
<body bgcolor="#FFFFFF" text="#000000" onLoad="document.form1.java.value=1;">
А вообще правильнее писать так:
Код:
<?php
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>
$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;
?>
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>
в зависимости от конкретности задачи.
Цитата: Nixus
Вообще-то пашет. Может проблема не в открывающемся <body> ?
А вообще правильнее писать так:
или так:
в зависимости от конкретности задачи.
А вообще правильнее писать так:
Код:
<?php
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>
$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;
?>
$src = "...";
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $src);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/", '$1', $res);
echo $res;
?>
в зависимости от конкретности задачи.
ни 1-е ни 2-е не пашут. если подставить мой хтмл-код, то результатом является повторение сорца, т.е. :
<html>
......
</html>
<html>
.....
</html>
Что у тебя за код? И что за версия PHP?
Цитата: 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" 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>';
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $original_html);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/", '$1', $res);
echo $res;
<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>';
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/", '', $original_html);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/", '$1', $res);
echo $res;
PHP 5.2.3
Код:
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/si", '', $original_html);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/si", '$1', $res);
echo $res;
$res = preg_replace("/(.*?)<\/body(\s|>).*$/si", '$1', $res);
echo $res;
Цитата: Nixus
Косяк за мной. Забыл si в конце РВ.
Код:
$res = preg_replace("/^.*?<body(\s[^>]*>|>)/si", '', $original_html);
$res = preg_replace("/(.*?)<\/body(\s|>).*$/si", '$1', $res);
echo $res;
$res = preg_replace("/(.*?)<\/body(\s|>).*$/si", '$1', $res);
echo $res;
о! работает. пасиб большое. :)
Для данной задачи очень бы пошло свойство 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);
}
};
/*
Класс 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);
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 ибо он закроет все теги, приведет имена в нижний регистр.
http://forum.codenet.ru/showthread.php?p=214136 немного дописал класс. Теперь можно использовать и с XML.
В свете вот этой темы: