Intereting Posts
Google Maps v2 div внутри или над картой PHP: тестирование существования ячейки в многомерном массиве Facebook FQL. Какой самый простой способ получить все изменения страницы в одном запросе, упорядоченном по дате / времени? Проверьте, сохранен ли IP-адрес в базе данных Imagick не открывает PDF-файлы с исключением «Не удалось прочитать файл» PHP PDO – отображение пароля при слишком большом количестве соединений Передавать аргументы из массива в php в конструктор Отображение сообщений об ошибках в Laravel после перенаправления с контроллера Маршрут к контроллеру в подпапке, не работающей в Laravel 4 Не удалось отправить Push-уведомление Является ли использование PHP для сопоставления нескольких файлов JavaScript, которые будут быстрее, чем включение их отдельно? Сессия: Конфигурированные файлы драйверов не найдены. Aborting Нужна помощь, игнорируя сертификат сервера при привязке к LDAP-серверу с помощью PHP PayPal и Php? Лучший способ узнать, какой php-файл сгенерировал html-строку кода в WordPress

php: parse html: извлекать теги скрипта из тела и вводить перед </ body>?

Мне все равно, что такое библиотека, но мне нужен способ извлечь <.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.