Как анализировать URL-адреса @ import с помощью php dom или regex?
Заданный html, такой как:
<!-- main layout and navbar stylesheets -->
<style type="text/css" media="all and (min-width:481px)">
@import url("/styles/main.css?v=11") screen, projection;
@import url("/styles/navbar.css?v=11") screen, projection;
</style>
Как получить URL-адреса @ import из этого куска html, используя php dom или regex ?
Что касается того, что я пытался , вот что я сделал, но это не делает этого:
preg_match("/(url(['"]?)([^"')]+)(["']?))/", $html, $matches);
5 ответов:
Вы должны использовать DOM. Но Использовать ли регулярное выражение его до вас . Проанализируйте содержание стиля с помощью dom.
$doc = new DOMDocument(); $doc->loadHTML($html); $nodes = $doc->getElementsByTagName("style"); for($i=0;$i<$nodes->length;$i++){ $style = $nodes->item($i)->textContent; // parse import rules on $style here. // read bellow. }
После этого либо вы используете какой-то css-парсер, написанный на PHP (например, PHP-CSS-Parser), либо применяете регулярное выражение.
Регулярное выражение, подобное following (escape в соответствии с вашей цитатой), будет хорошо разбирать его.
!@import\s+url\((['"])(.+?)\\1\)!
См. Пример .
Вот еще один способ сделать это:
<?php $html = ' <!-- main layout and navbar stylesheets --> <style type="text/css" media="all and (min-width:481px)"> @import url("/styles/main.css?v=11") screen, projection; @import url("/styles/navbar.css?v=11") screen, projection; </style> '; if(preg_match_all('/url\(\"([^)]+)\"\)/', $html, $matches)){ foreach($matches[1] as $url){ print $url . "<br />"; } }else{ print "No matches"; } ?>
Phpfiddle Ссылка: http://phpfiddle.org/main/code/w69-ecy
Надеюсь, это поможет.
Вот рабочий код, использующий PHP regexp:)
Включая также рабочую скрипку: http://phpfiddle.org/main/code/yc5-61s
<?php $inputString = '<!-- main layout and navbar stylesheets --> <style>url1</style> <style type="text/css" media="all and (min-width:481px)"> @import url("/styles/main.css?v=11") screen, projection; @import url("/styles/navbar.css?v=11") screen, projection; url @import url("http://www.jirilmon/style.css?v=99") screen, projection; url </style>'; if(preg_match_all('/(@import) (url)\(([^>]*?)\)/',$inputString, $matches)){ print_r($matches[3]); }else{ print "No matches"; } ?>
Попробуйте вот это https://regex101.com/r/QrQxBN/1
Работа с
@import "font-awesome.min.css"; @import "simple-line-icons.css"; @import url(http://fonts.googleapis.com/css?family=Montserrat:700,400); @import url('http://fonts.googleapis.com/css?family=ggg'); @import url("http://fonts.googleapis.com/css?family=ggg");
Регулярное выражение
preg_match_all ("/@import[ ]*['\"]{0,}(url\()*['\"]*([^;'\"\)]*)['\"\)]*/ui", $csscontent, $urlscss2); var_dump($cssFile); var_dump($urlscss2);
Отличные решения, однако недостаточно широк, я должен был изменить его, чтобы сделать его шире и захватить различные форматы @ import.
/@import (url\(\"?)?(url\()?(\")?(.*?)(?(1)\")+(?(2)\))+(?(3)\")/ig
С этим регулярным выражением вы можете захватить и это:
@import url(comments.css); @import "/style/main.css" @import url("style-1024.css")
Рабочий пример: http://regex101.com/r/uC4sH2/1