我有一个HTML文档,我想自动将版本号添加到所有脚本和样式表引用中。将版本号添加到HTML文档中的.js和.css引用的正则表达式
以下应更换
与
其中123456是我的动力版本号。
但768,16只做上
应保持不变的本地文件。
到目前为止,我有以下的正则表达式:
$html = preg_replace('#(src|href)=("|\')(?!http)(?!("|\'| |\+))(.*)\.(css|js|swf)("|\')#Ui', '\\1=\\2\\3\\4.v'.$version .'.\\5\\6', $html);
但它不工作100%,我相信存在这样一种更好的方式。 你会如何写它?
编辑:
我现在使用DOM文档,但事实证明,这是很慢!
//------- snip --------------
$host = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
$refs = array();
$version = "v". $version;
$doc = new DOMDocument();
$tmpDoc = $html;
$doc->loadHTML($tmpDoc);
$xpath = new DOMXPath($doc);
foreach($xpath->query('/html/head/link/@href') as $href) {
$ref = $href->value;
if(
!preg_match('/^https?:/', $ref) ||
strpos($ref, $host) === 0
) {
$refs[$ref] = preg_replace('/\.css$/', '.'.$version.'$0', $ref);
}
}
foreach ($xpath->query('//script/@src') as $src) {
$ref = $src->value;
if(
!preg_match('/^https?:/', $ref) ||
strpos($ref, $host) === 0
) {
$refs[$ref] = preg_replace('/\.js$/', '.'.$version.'$0', $ref);
}
}
$html = str_replace(
array_keys($refs),
array_values($refs),
$tmpDoc
);
//------- snip --------------
?>
2010-02-11
Alex
+0
您可以快速(将'.css“简单地替换为'.12345.css”'),或者您可以拥有正确的(DOM解析,步行和重新序列化)。你不能同时拥有两种:这种后处理不是一项简单的任务。如果你需要快速和正确的话,你必须改变生成这个标记的模板。 –
2010-02-11 14:46:07