我有一个新闻通讯系统,我试图在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来捕获第一个脚本?
答案 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";
}