我想将javascript文件合并为一个文件,以减少对服务器的请求量。因为没有插件,我想自己编写代码。不幸的是,CMS没有中心功能来包含可以被覆盖的javascript文件或类似的东西。所以我不得不在源代码中搜索并替换脚本标签,然后才会将输出结果打印给用户。
为了获得链接,我写了一个正则表达式模式,它匹配任何带有src-attribute的script-tag:
$scriptTagPattern = '#<script (?:.+)?src="([^"]+)">#';
我认为这应该是正确的,因为有不同的脚本标签。我在解析之前从模板中获取源代码,因此src-attribute也可以包含这样的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>
答案 0 :(得分:1)
使用正则表达式从HTML或XML文档中提取信息被认为是不好的做法,因为现实生活中的正则表达式很脆弱且难以维护。在PHP DOMDocument
中使用DOM解析器:
$doc = new DOMDocument();
$doc->loadHTML($YOUR_HTML);
foreach($doc->getElementsByTagName('script') as $script) {
if($script->hasAttribute('src')) {
echo $script->getAttribute('src') . PHP_EOL;
}
}
答案 1 :(得分:1)
我解决了问题:正则表达式很好,我使用了preg_match()而不是preg_match_all(),所以我只得到了每个模板中的第一个文件。简单但有效......