2014-03-12 41 views
0

我想將JavaScript文件合併爲一個腳本標籤以減少對服務器的請求量。由於沒有插件,我想自己編寫代碼。不幸的是,CMS沒有中央功能來包含可以被覆蓋的javascript文件或類似的東西。所以我不得不搜索並替換源代碼中的腳本標籤,然後php會將outout輸出給用戶。在PHP中匹配每個腳本標籤與src屬性

要獲得鏈接,我寫這與SRC屬性的任何腳本標籤相匹配的正則表達式模式:

$scriptTagPattern = '#<script (?:.+)?src="([^"]+)">#'; 

我想是因爲有不同的腳本標籤,這應該是正確的。而我正從模板的源他們得到解析之前,所以在src屬性還可以包括PHP代碼是這樣的:

<script type="text/javascript" src="' . $options['baseurl'] . '/scripts/somejsfile.js"></script> 

我的模式工作,但只有部分。 例如以下腳本匹配:

http://code.jquery.com/jquery-2.1.0.min.js 
/scripts/yui/yuiloader-dom-event/yuiloader-dom-event.js 

但下面不匹配:

<script type="text/javascript" src="scripts/read_marker.js?v=' . $options['simpleversion'] . '"></script> 

我不明白爲什麼我的模式不匹配這裏。例如,yuiloader(參見上文實施例)具有以下源,其是類似於read_marker腳本:

<script type="text/javascript" src="' . Template::fetchStylevar("yuipath") . '/yuiloader-dom-event/yuiloader-dom-event.js"></script> 

回答

1

使用正則表達式來提取HTML或XML文檔信息被認爲是不好的做法在現實的正則表達式生活文件很脆弱,難以維護。使用DOM解析器,在PHP DOMDocument,對於這一點:

$doc = new DOMDocument(); 
$doc->loadHTML($YOUR_HTML); 

foreach($doc->getElementsByTagName('script') as $script) { 
    if($script->hasAttribute('src')) { 
     echo $script->getAttribute('src') . PHP_EOL; 
    } 
} 
+0

這也是我的第一個想法。但是這不起作用,解析器因爲大多數元素的src標籤內部的php代碼而be嘴。所以我認爲使用正則表達式會更好,而不是將每個變量替換爲其字符串值。 – Lion

+0

你需要在你的模板中使用'<?php insert_script('...')?>'方法。在此方法中積累腳本,並在您的模板中使用。 – hek2mgl

+0

是的,這將是最好的解決方案。但不幸的是,CMS使用自定義模板語言,其中不允許直接的php代碼。另一個大問題是模板必須改變。該插件應該稍後纔會發佈,因此它應該儘可能地容易使用。 – Lion

1

我解決了這個問題:正則表達式是好的,我用來代替preg_match_all()的preg_match(),所以我只拿到了第一個文件中的每個模板。簡單而有效...

相關問題