用PHP(RegEx)提取加载页面的部分内容

时间:2010-02-07 00:07:32

标签: php regex curl

我有一个新闻通讯系统,我试图在PHP网站中加入。 PHP站点加载内容区域,并将脚本加载到页面的头部。这适用于为网站生成的代码,但现在我收到了我想要合并的简报。

最初我打算使用iFrame,但是AJAX和jQuery调用的数量使得它非常复杂。

所以我认为我可以使用cURL将新闻稿页面加载为变量。然后我将使用RegEx来获取body标签之间的内容并将其放在内容区域中。最后,我将再次使用RegEx搜索头部并抓取任何脚本。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $config_live_site."lib/alerts/user/update.php?email=test@test.com.au"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HEADER, 0);
$loaded_result = curl_exec( $ch ); # run!
curl_close($ch);

// Capture the body content and place in $_content
if (preg_match('%<body>([\s\S]*)</body>%', $loaded_result, $regs)) {
 $_content .= $regs[1];
} else {
 $_content .= "<p>No content to display.</p>";
}

// Capture the scripts and place in the head
if (preg_match('%(<script type="text/javascript">[\s\S]*</script>)%', $loaded_result, $regs)) {
 $headDetails .= $regs[0];
}

这大部分时间都有效,但如果文档正文中有一个脚本,它会捕获到最后一个/脚本'。

我猜我的问题是双重的......

一个。是否有更好的整体方法(我的截止日期很短,所以它需要是一个快速的解决方案,而不需要编辑新闻通讯代码)?

B中。我需要使用什么RegEx来捕获第一个脚本?

4 个答案:

答案 0 :(得分:2)

我认为您需要在?之后向脚本正则表达式添加*,这样才不会贪心。贪婪的正则表达式尽可能匹配(第一个开始标记和最后一个结束之间的所有内容),非贪婪匹配尽可能少(仅在开始标记和第一个结束标记之间)。尝试:

%(<script type="text/javascript">[\s\S]*?</script>)%

如上所述,将其更改为preg_match_all,您应该只匹配各个脚本部分,而不是第一个和最后一个脚本标记之间的所有内容。

答案 1 :(得分:1)

答:我发现使用正则表达式从HTML页面中提取所需的位数没有问题,这些页面不一定有效。事实上,我与之合作的一些蜘蛛解决方案就是这样做的。

B:使用preg_match_all()代替preg_match()。 preg_match()只捕获第一个匹配,而preg_match_all()将继续,直到字符串结束并返回所有匹配。

答案 2 :(得分:0)

快速而肮脏的响应可以是:捕获后立即删除正文内容。然后继续

if (preg_match('%<head>([\s\S]*)</head>%', $loaded_result, $regs)) {
   $_header .= $regs[1];
} else {
   $_header .= "<p>No content to display.</p>";
}

然后将正则表达式应用于标题

if (preg_match('%(<script type="text/javascript">[\s\S]*</script>)%', $_header, $regs)) {
   $headDetails .= $regs[0];
}

如果从curl获得的html格式正确,则应使用simplexml来执行提取。顾名思义,它使用起来非常简单。

$xml = simplexml_load_string($loaded_content);

$body = $xml->body->asXML();

$scripts = $xml->xpath('//head/script');
foreach ($scripts as $script) {
  $_scripts .= $script->asXML();
}

如果您的html格式不正确,那么您应该采用整洁来规范它(或者更好,更正输出无效html内容的脚本)

答案 3 :(得分:-1)

$doc = new DOMDocument();
$doc->loadHTML($loaded_result);
$xpath = new DOMXpath($doc);

$kod = $xpath->query("//head/script");
$i = 0;
foreach($kod as $node){
    echo 'im the script nº'.(++$i).' in the head and this is my content: ';
    echo $doc->saveXML($node)."\n";
}