如何使用php dom或regex解析@import URL?

时间:2013-01-12 15:37:10

标签: php regex dom domdocument

给出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>

如何使用php dom或regex从那大块html中获取@import网址?

至于我尝试的是什么,这是我做的,但它没有做到:

preg_match("/(url\([\'\"]?)([^\"\'\)]+)([\"\']?\))/", $html, $matches);

5 个答案:

答案 0 :(得分:3)

必须使用DOM 。但是否将RegEx用于你。使用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.
   }

之后要么使用某种用PHP编写的css解析器(例如PHP-CSS-Parser),要么应用正则表达式。

如下所示的正则表达式(根据你的引用逃脱)将很好地解析它。

!@import\s+url\((['"])(.+?)\\1\)!

请参阅Example

答案 1 :(得分:3)

这是另一种方法:

<?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

希望它有所帮助。

答案 2 :(得分:1)

这是使用php regex的工作代码:)

还包括一个工作小提琴: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";
}
?>

答案 3 :(得分:1)

试试这个 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);

答案 4 :(得分:0)

优秀的解决方案,但不够宽泛,我不得不修改它以使其更宽,并抓住@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