我不在乎图书馆是什么,但我需要一种方法来提取< .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对象进行操作和操作)。
答案 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);