Как анализировать 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 2

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