У меня есть HTML-документ, в котором я хочу автоматически добавить номер версии ко всем ссылкам на скрипты и таблицы стилей.
следует заменить следующее
<link ... href="file.css" media="all" />
<script ... src="file.js"></script>
<script ... src="http://myhost.com/file.js"></script>
с этим
<link ... href="file.v123456.css" media="all" />
<script ... src="file.v123456.js"></script>
<script ... src="http://myhost.com/file.v123456.js"></script>
, где 123456 - это мой динамический номер версии.
Но это должно быть сделано ТОЛЬКО для локальных файлов
<link ... href="http://otherhost.com/file.css" media="all" />
следует оставить нетронутым.
Пока у меня есть следующее регулярное выражение:
$html = preg_replace('#(src|href)=("|\')(?!http)(?!("|\'| |\+))(.*)\.(css|js|swf)("|\')#Ui', '\\1=\\2\\3\\4.v'.$version .'.\\5\\6', $html);
Но это не работает на 100%, и я уверен, что есть лучший способ сделать это.
Как бы вы это написали?
Edit:
У меня сейчас есть DOMDocument, но оказывается, что он довольно медленный!
<?php
//------- 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 --------------
?>