将每个脚本标签与PHP中的SRC-Attribute匹配



我想将javascript文件组合到一个单个文件中,以减少对服务器的请求量。因为没有插件,所以我想自己编码一些内容。不幸的是,CMS没有中央功能包括可以覆盖或类似的东西的JavaScript文件。因此,在php将户外打印给用户之前,我被迫搜索和替换源标签。

要获取我写的链接,我写了一个正则pattern,它在任何脚本标签上与src-attribute匹配:

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

使用正则表达式从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;
    }
}

i解决了问题:正则是正确的,我使用preg_match(),而不是preg_match_all(),所以我只在每个模板中获取了第一个文件。简单但有效...

最新更新