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

これを行う別の方法を次に示します。

<?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 に答える
3

DOM を使用する必要があります。しかし、正規表現を使用するかどうかはあなた次第です。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 に答える
1

これがphp正規表現を使用した作業コードです:)

動作するフィドルも含める: 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 に答える