2

给定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 URL?

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

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

5 回答 5

3

必须使用 DOM。但是否使用 RegEx 取决于您。使用 dom 解析 style 的内容。

   $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\)!

请参阅示例

于 2013-01-12T16:24:55.527 回答
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

希望能帮助到你。

于 2013-01-12T16:30:31.850 回答
1

这是使用 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";
}
?>
于 2013-01-12T16:28:17.320 回答
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);
于 2016-10-07T13:52:03.083 回答
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

于 2014-09-08T17:18:31.097 回答