在PHP中将每个Script-Tag与src-Attribute匹配

时间:2014-03-12 14:46:30

标签: php regex

我想将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>

2 个答案:

答案 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(),所以我只得到了每个模板中的第一个文件。简单但有效......

相关问题