Php 带cURL和Regex的屏幕刮削

Php 带cURL和Regex的屏幕刮削,php,regex,curl,Php,Regex,Curl,考虑以下格式的文档: <!DOCTYPE html> <html> <head> <title></title> <body> <div class="blog_post_item first"> <?php // some child elements ?> </div><!-- end blog_post_item --> </body>

考虑以下格式的文档:

<!DOCTYPE html>
<html>
<head>
<title></title>
<body>
   <div class="blog_post_item first">
       <?php // some child elements ?>
   </div><!-- end blog_post_item -->
</body>
</html>

当然,现在$output包含了整个源代码。如何获得该元素的内容?

如果您确定开始和结束总是相同的,那么这很容易。你所要做的就是搜索开始和结束,并匹配这两者之间的所有内容。我想很多人会因为我使用regex查找一点HTML而对我大发雷霆,但它可以做到这一点

// cURL
$ch = curl_init("http://a.web.page.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);

if(empty($output)) exit('Couldn\'t download the page');

// finding your data
$pattern = '/<div class="blog_post_item first">(.*?)<\/div><!-- end blog_post_item -->/';

preg_match_all($pattern, $output, $matches);
var_dump($matches); // all matches

这段代码应在>=5.3.6和dom扩展中工作:

$s = <<<EOM
<!DOCTYPE html>
<html>
<head>
<title></title>
<body>
   <div class="blog_post_item first">
       <?php // some child elements ?>
   </div><!-- end blog_post_item -->
</body>
</html>
EOM;

$d = new DOMDocument;
$d->loadHTML($s);

$x = new DOMXPath($d);

foreach ($x->query('//div[contains(@class, "blog_post_item") and contains(@class, "first")]') as $el) {
        echo $d->saveHTML($el);
}

如果您确定以下结构:

<div class="blog_post_item first">
   WHATEVER
</div><!-- end blog_post_item -->
如果你确定结尾代码没有出现在任何地方,那么你可以简单地抓住它

请注意,我用任何东西替换了您原来的PHP。CURL将只获取HTML,它将包含内容,而不是PHP

你不需要正则表达式。您也可以通过搜索想要的字符串来实现这一点,如下面的示例所示

$curlResponse = '
<!DOCTYPE html>
<html>
<head>
<title></title>
<body>
   <div class="blog_post_item first">
       <?php // some child elements ?>
   </div><!-- end blog_post_item -->
</body>
</html>';

$startStr = '<div class="blog_post_item first">';
$endStr = '</div><!-- end blog_post_item -->';

$startStrPos = strpos($curlResponse, $startStr)+strlen($startStr);
$endStrPos = strpos($curlResponse, $endStr);

$wanted = substr($curlResponse, $startStrPos, $endStrPos-$startStrPos );

echo htmlentities($wanted);

这是一个好的开始,但var_转储$matches;正在给我array2{[0]=>array0{}[1]=>array0{}我可以得到一个URL,这样我就可以自己试一试了吗?a、 web.page.com显然不存在。另外,我添加了一个额外的检查,看看你是否在第一时间得到了回复。我不想公开链接到该网站。我查看了你的网站,但找不到联系信息。您可以给我发电子邮件,我可以返回URL。@JezenThomas使用了您网站上的联系表单+1是我能做的最好的了。可惜我不能把两个答案都标为正确!extdom是正确的选择。就我个人而言,我会使用cURL获取目标url输出并在一个操作中缓存它,然后像@Jack在另一个操作中解释的那样进行分析。例如,隔离与url抓取服务器关闭、超时、线路问题等相关的各种延迟问题。每天,它会给我一大堆警告。@JezenThomas使用libxml\u use\u internal\u errorstrue可以消除这些警告。这很容易理解。我喜欢!谢谢
<div class="blog_post_item first">
   WHATEVER
</div><!-- end blog_post_item -->
$curlResponse = '
<!DOCTYPE html>
<html>
<head>
<title></title>
<body>
   <div class="blog_post_item first">
       <?php // some child elements ?>
   </div><!-- end blog_post_item -->
</body>
</html>';

$startStr = '<div class="blog_post_item first">';
$endStr = '</div><!-- end blog_post_item -->';

$startStrPos = strpos($curlResponse, $startStr)+strlen($startStr);
$endStrPos = strpos($curlResponse, $endStr);

$wanted = substr($curlResponse, $startStrPos, $endStrPos-$startStrPos );

echo htmlentities($wanted);