2013-01-12 20 views
2

給定的HTML如:如何使用php dom或regex解析@import URL?

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

如何獲得@import網址從使用PHP DOM或正則表達式的HTML的該塊的?

至於什麼我試過,這裏是我做過什麼,但它並沒有做到這一點:

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

這編輯是沒有必要考慮你已經張貼你嘗試過什麼人之前甚至可以問。放鬆。 – BoltClock

+0

@BoltClock:同意發佈以解決大小寫情況:) – dev02

回答

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. 
    } 

後,要麼你使用某種形式的CSS解析器的PHP編寫的(例如PHP-CSS-Parser)或應用正則表達式。

像下面的正則表達式(根據您的報價逃脫)將解析得很好。

[email protected]\s+url\((['"])(.+?)\\1\)! 

參見Example

+0

regexp不匹配@import'file.css';'這也是有效的 - 請參閱https://developer.mozilla.org/en- US/docs/Web/CSS/@ import#例子我推薦使用正則表達式。 Doe' – mikep

+0

這就是正則表達式的問題。內容發生變化,您需要更新您的正則表達式。 :( –

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"; 
} 
?> 
+0

-1。**它也會解析Non-STYLE標籤的'@ import'文本**。 –

+0

shilplu,@import rule導入外部樣式表。所以如果你在你的html中發現這個規則,那麼你的意圖就是包含css。我不認爲人們使用這個規則在HTML中的任何其他目的! – OMG

+0

只需使用此頁面的源代碼並應用您的正則表達式。你會得到額外的7條規則。 –

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

希望它有幫助。

+0

-1。 **它也會解析非風格標籤'@ import' text **。像[this](http://codepad.viper-7.com/BkMIxS)一樣。這就是爲什麼你應該總是避免使用RegEx來解析HTML –

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

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); 
+0

'''''{0,}'可以改成'['\「] *'和'(url \()'爲'(?:url \()'...我們不需要submatch字符串「url(」所以搜索到的URL將在$ match [1]不是$ match [2] – mikep