HTTP-запрос
Сначала вы делаете HTTP-запрос для получения содержимого страницы. Есть несколько способов сделать это.
Еореп
Самый простой способ отправить HTTP-запрос - использовать fopen
. Основным преимуществом является то, что вы можете установить, сколько символов читается за раз, что может быть полезно при чтении очень больших файлов. Однако сделать это не так просто, и делать это не рекомендуется, если вы не читаете очень большие файлы и не боитесь проблем с памятью.
$fp = fopen("http://www.4wtech.com/csp/web/Employee/Login.csp", "rb");
if (FALSE === $fp) {
exit("Failed to open stream to URL");
}
$result = '';
while (!feof($fp)) {
$result .= fread($fp, 8192);
}
fclose($fp);
echo $result;
file_get_contents
Самый простой способ - просто использовать file_get_contents
. Если делает более или менее то же самое, что fopen, но у вас есть меньше вариантов, которые вы можете выбрать. Основным преимуществом здесь является то, что он требует только одну строку кода.
$result = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');
echo $result;
розетки
Если вам нужно больше контроля над тем, какие заголовки отправляются на сервер, вы можете использовать сокеты в сочетании с fopen
.
$fp = fsockopen("www.4wtech.com/csp/web/Employee/Login.csp", 80, $errno, $errstr, 30);
if (!$fp) {
$result = "$errstr ($errno)<br />\n";
} else {
$result = '';
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.4wtech.com/csp/web/Employee/Login.csp\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
$result .= fgets($fp, 128);
}
fclose($fp);
}
echo $result;
* * 1 022 потоков * * 1 023
Кроме того, вы также можете использовать потоки. Потоки похожи на сокеты и могут использоваться в комбинации с fopen
и file_get_contents
.
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp', false, $context);
echo result;
Curl
Если ваш сервер поддерживает cURL (обычно это так), рекомендуется использовать cURL. Ключевое преимущество использования cURL заключается в том, что он опирается на популярную библиотеку C, обычно используемую в других языках программирования. Он также предоставляет удобный способ создания заголовков запросов и автоматического анализа заголовков ответов с простым интерфейсом в случае ошибок.
$defaults = array(
CURLOPT_URL, "http://www.4wtech.com/csp/web/Employee/Login.csp"
CURLOPT_HEADER=> 0
);
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
if( ! $result = curl_exec($ch)) {
trigger_error(curl_error($ch));
}
curl_close($ch);
echo $result;
Библиотека
Кроме того, вы можете использовать одну из многих библиотек PHP . Я бы не рекомендовал использовать библиотеку, так как это может быть излишним. В большинстве случаев вам лучше написать свой собственный класс HTTP с использованием cURL.
Разбор HTML
PHP имеет удобный способ загрузки любого HTML в DOMDocument
.
$pagecontent = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');
$doc = new DOMDocument();
$doc->loadHTML($pagecontent);
echo $doc->saveHTML();
К сожалению, поддержка PHP5 для HTML5 ограничена. Если вы столкнулись с ошибками при попытке проанализировать содержимое вашей страницы, подумайте об использовании сторонней библиотеки. Для этого я могу порекомендовать Masterminds / html5-php . Разбор HTML-файла с этой библиотекой очень похож на разбор HTML-файла с DOMDocument
.
use Masterminds\HTML5;
$pagecontent = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');
$html5 = new HTML5();
$dom = $html5->loadHTML($html);
echo $html5->saveHTML($dom);
В качестве альтернативы вы можете использовать, например. моя библиотека PHPPowertools / DOM-Query . Он использует настроенную версию Masterminds / html5-php под капотом, анализирующую строку HTML5 в DomDocument
и symfony / DomCrawler для преобразования селекторов CSS в селекторы XPath. Он всегда использует один и тот же DomDocument
, даже при передаче одного объекта другому, для обеспечения достойной производительности.
namespace PowerTools;
// Get file content
$pagecontent = file_get_contents( 'http://www.4wtech.com/csp/web/Employee/Login.csp' );
// Define your DOMCrawler based on file string
$H = new DOM_Query( $pagecontent );
// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query( $H->select('body') );
// Passing a string (CSS selector)
$s = $H->select( 'div.foo' );
// Passing an element object (DOM Element)
$s = $H->select( $documentBody );
// Passing a DOM Query object
$s = $H->select( $H->select('p + p') );
// Select the body tag
$body = $H->select('body');
// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');
// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');
// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
return $i . " - " . $val->attr('class');
});
// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');
// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');
// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));
// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});
// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();
// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');
// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');