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
最简单的方法就是使用.如果或多或少与 fopen 相同,但您可以选择的更少。这里的一个主要优点是它只需要一行代码。file_get_contents
$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;
流
或者,您也可以使用流。流类似于套接字,可以与 和 结合使用。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的一个关键优点是它依赖于其他编程语言中常用的流行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 库之一。不过,我不建议使用库,因为它可能有些过分。在大多数情况下,您最好在后台使用cURL编写自己的HTTP类。
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();
不幸的是,PHP对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字符串解析为symfony/DomCrawler,用于将CSS选择器转换为XPath选择器。它总是使用相同的,即使在将一个对象传递给另一个对象时,也要确保良好的性能。DomDocument
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>');