Мне все равно, что такое библиотека, но мне нужен способ извлечь <.script.> Элементы из <.body.> Страницы (в виде строки). Затем я хочу вставить извлеченные <.script.> S перед <./ body.>.
В идеале я хотел бы извлечь <.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 часа попыток и неудач, использование альтернативных библиотек, сбоев и т. д.).
Основываясь на прекрасном ответе RegEx от @ alreadycoded.com, мне удалось собрать следующее:
$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-файлов не работал (или я не мог пробираться сквозь нафарные объекты и манипулировать ими).
$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);
Чтобы выбрать все узлы скриптов с атрибутом src
$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 }
Попробуйте https://github.com/fabpot/goutte, это интуитивно понятный и простой в использовании.
Если вы действительно ищете простой lib для этого, я могу порекомендовать это :
$dom = str_get_html($html); $scripts = $dom->find('script')->remove; $dom->find('body', 0)->after($scripts); echo $dom;
На самом деле нет простого способа делать такие вещи на PHP.