php:解析html:从body中提取脚本标签并注入之前?

时间:2014-05-02 13:20:11

标签: php dom html-content-extraction

我不在乎图书馆是什么,但我需要一种方法来提取< .script。>来自页面的< .body。> 的元素(作为字符串)。然后,我想在< ./ body。>之前插入提取的< .script。>。

理想情况下,我想将< .script。> s提取为2种类型;
1)外部(具有src属性的那些) 2)嵌入式(代码在< .script。>< ./ script。>之间)

到目前为止,我已尝试使用phpDOM,Simple HTML DOM和Ganon 我对它们中的任何一个都没有运气(我可以找到链接并删除/打印它们 - 但每次都失败了脚本!)。

替代 https://stackoverflow.com/questions/23414887/php-simple-html-dom-strip-scripts-and-append-to-bottom-of-body (抱歉重新发布,但它已经24小时尝试和失败,使用替代库,失败更多等。)


基于来自@ alreadycoded.com的可爱的RegEx答案,我设法将以下内容混为一谈;

$output = "<html><head></head><body><!-- Your stuff --></body></html>"
$content = '';
$js = '';

// 1) Grab <body>
preg_match_all('#(<body[^>]*>.*?<\/body>)#ims', $output, $body);
$content = implode('',$body[0]);

// 2) Find <script>s in <body>
preg_match_all('#<script(.*?)<\/script>#is', $content, $matches);
foreach ($matches[0] as $value) {
    $js .= '<!-- Moved from [body] --> '.$value;
}

// 3) Remove <script>s from <body>
$content2 = preg_replace('#<script(.*?)<\/script>#is', '<!-- Moved to [/body] -->', $content); 

// 4) Add <script>s to bottom of <body>
$content2 = preg_replace('#<body(.*?)</body>#is', '<body$1'.$js.'</body>', $content2);

// 5) Replace <body> with new <body>
$output = str_replace($content, $content2, $output);

这项工作是做什么的,并且不会那么慢(一秒钟的一小部分)

羞耻没有任何DOM工作正在发挥作用(或者我还没有通过naffed对象进行操作和操作)。

4 个答案:

答案 0 :(得分:7)

选择具有src-attribute

的所有脚本节点
$xpathWithSrc = '//script[@src]';

选择包含内容的所有脚本节点:

$xpathWithBody = '//script[string-length(text()) > 1]';

基本用法(用实际的xpath查询替换查询):

$doc = new DOMDocument();
$doc->loadHTML($html);

$xpath = new DOMXpath($doc);

foreach($xpath->query('//body//script[string-length(text()) > 1]') as $queryResult) {
    // access the element here. Documentation:
    // http://www.php.net/manual/de/class.domelement.php
}

答案 1 :(得分:2)

尝试https://github.com/fabpot/goutte它直观且易于使用。

答案 2 :(得分:1)

如果你真的想要一个简单的lib,我可以推荐this one

$dom = str_get_html($html);
$scripts = $dom->find('script')->remove;
$dom->find('body', 0)->after($scripts);
echo $dom;

在PHP中做这样的事情并不容易。

答案 3 :(得分:0)

$js = "";
$content = file_get_contents("http://website.com");
preg_match_all('#<script(.*?)</script>#is', $content, $matches);
foreach ($matches[0] as $value) {
    $js .= $value;
}
$content = preg_replace('#<script(.*?)</script>#is', '', $content); 
echo $content = preg_replace('#<body(.*?)</body>#is', '<body$1'.$js.'</body>', $content);