当前位置:首页 > PHP教程 > php应用 > 列表

如何使用php脚本给html中引用的js和css路径打上版本号

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-26 21:23:58 浏览: 评论:0 

这篇文章主要介绍了如何使用php脚本给html中引用的js和css路径打上版本号,打版本号有个好处就是可以解决外部应用文件实时更新问题,喜欢的朋友一起看看全文吧。

在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、js等,而不必从你的服务器读取,这样在一定程度上加快了网站的打开速度,又可以节约一下你的服务器流量。

具体文字说明不给大家多说了,下面通过代码实例给大家讲解。

比如:

<link rel="stylesheet" type="text/css" href="./css/globel.css">

<script src="./js/config.js"></script>

中的href和src加上版本

<link rel="stylesheet" type="text/css" href="./css/globel.css?eslc-app=3-0-2">

<script src="./js/config.js?eslc-app=3-0-2"></script>

当然如果不是前后端 分离得干干净净的,就没必要这么额外的这样自己在写个脚本去打版本。

打版本的好处:

解决外部引用文件实时更新问题。比如

pc端上主要体现在 iframe中的外部引用文件不会实时更新。

wap端上部分app也是比如微信。 如果你的网页是嵌到自己的app,那也更不用说了。

用php写了个类

  1. //生成版本 
  2. //清除版本 
  3. class ReplaceVersion{ 
  4.  protected $filePostFixs = array(); 
  5.  protected $versionName = null; 
  6.  protected $version = null; 
  7.  protected $path = null; 
  8.  /** 
  9.   * @param mixed $configs  
  10.   * @param [type] $profix [description] 
  11.   * @param [type] $path  [description] 
  12.   */ 
  13.  public function __construct($configs$profix$path){ 
  14.   if (!$this->isCanRun()) { 
  15.    $this->error('必须在内网环境 10.10.0开头才可运行'); //exit; 
  16.   } 
  17.   $this->setVersion($configs); 
  18.   $this->setFilePostFix($profix); 
  19.   $this->path = $path
  20.  } 
  21.  protected function isCanRun(){ 
  22.   if (strpos($_SERVER['HTTP_HOST'], '10.10.0') !== false) { 
  23.    return true; 
  24.   } 
  25.   return false; 
  26.  } 
  27.  /** 
  28.   * 匹配到script节点 
  29.   * @param array $match 匹配到的script 
  30.   * @return string 处理好的script 
  31.   */ 
  32.  protected function callbackScript($match){ 
  33.   //["<script src="../js/config.js?is=new"></script>", "../js/config.js", "?is=new"] 
  34.   /*/<script.*?src=\"(.*?)(\?.*?|\?)?\".*?><\/script>/*/ 
  35.   $str = $match[0]; 
  36.   $pattern = '/(<script.*?src=\")(.*)?(\"><\/script>)/'
  37.   return $this->callbackMatch($str$pattern); 
  38.  } 
  39.  /** 
  40.   * 匹配到css节点 
  41.   * @param array $match 匹配到的css 
  42.   * @return string 处理好的css 
  43.   */ 
  44.  protected function callbackCss($match){ 
  45.   // '<link rel="stylesheet" type="text/css" href="../css/globel.css">'; 
  46.   $str = $match[0]; 
  47.   $pattern = '/(<link.*?href=\")(.*)?(\".*?>)/'
  48.   return $this->callbackMatch($str$pattern); 
  49.  } 
  50.  /** 
  51.   * 回调模式匹配 
  52.   * @param string $str  
  53.   * @param string $pattern 
  54.   * @return string   
  55.   */ 
  56.  protected function callbackMatch($str$pattern){ 
  57.   switch ($this->dealFlag) { 
  58.    case 'replace'
  59.     return $this->replaceCallbackMatch($str$pattern); 
  60.    case 'clean'
  61.     return $this->cleanCallbackMatch($str$pattern); 
  62.    default
  63.     $this->error('非法模式'); 
  64.   } 
  65.  } 
  66.  /** 
  67.   * 替换版本 
  68.   * @param string $str 待处理的string 
  69.   * @param string $pattern 正则 
  70.   * @return string  处理后的string 
  71.   */ 
  72.  protected function replaceCallbackMatch($str$pattern){ 
  73.   if (!preg_match($pattern$str$third)) { 
  74.    return $str
  75.   } 
  76.   $arr  = explode('?'$third[2]); 
  77.   $len  = count($arr); 
  78.   $versionName = $this->versionName; 
  79.   $version = $this->version; 
  80.   if ($len === 1) {//没有问号 
  81.    $arr[0] .= '?'$versionName'='$version
  82.   }else{//有问号 
  83.    if (preg_match('/(^|\&)'$versionName.'=(.*?)($|\&)/'$arr[1])) {//存在 
  84.     $arr[1] = preg_replace('/(^|\&)'$versionName.'=(.*?)($|\&)/''$1'$versionName.'='$version'$3'$arr[1]); 
  85.     $arr[0] .= '?'$arr[1]; 
  86.    }else{//不存在 
  87.     $arr[0] .= '?'$arr[1]. '&'$versionName'='$version
  88.    } 
  89.   } 
  90.   return $third[1]. $arr[0]. $third[3]; 
  91.  } 
  92.  /** 
  93.   * 清除版本 
  94.   * @param string $str 待清除的版本 
  95.   * @param string $pattern 正则 
  96.   * @return string  清除后的string 
  97.   */ 
  98.  protected function cleanCallbackMatch($str$pattern){ 
  99.   if (!preg_match($pattern$str$third)) { 
  100.    return $str
  101.   } 
  102.   $arr  = explode('?'$third[2]); 
  103.   $len  = count($arr); 
  104.   $versionName = $this->versionName; 
  105.   if ($len > 1 && strpos($arr[1], $versionName'=') !== false) { 
  106.    $arr[1] = preg_replace('/(^|\&)'$versionName.'=(.*?)($|\&)/''$1'$arr[1]); 
  107.    substr($arr[1], -1) === '&' && ($arr[1] = substr($arr[1], 0, -1)); 
  108.    $arr[0] .= strlen($arr[1]) > 0 ? '?'$arr[1] : ''
  109.    $str = $third[1]. $arr[0]. $third[3]; 
  110.   } 
  111.   return $str
  112.  } 
  113.  /** 
  114.   * 执行 
  115.   */ 
  116.  protected function run(){ 
  117.   if ($this->path == '') { 
  118.    $this->error('empty path'); 
  119.    return ; 
  120.   } 
  121.   if (is_dir($this->path)) { 
  122.    $this->setDirFilesVersion( $this->path ); 
  123.   }else if(is_file($this->path)){ 
  124.    $this->setFileVersion( $this->path ); 
  125.   }else
  126.    $this->error('error path'); 
  127.   } 
  128.  } 
  129.  /** 
  130.   * 添加版本 
  131.   */ 
  132.  public function replace(){ 
  133.   $this->dealFlag = 'replace'
  134.   $this->run(); 
  135.   echo 'replace success'
  136.  } 
  137.  /** 
  138.   * 清除版本 
  139.   */ 
  140.  public function clean(){ 
  141.   $this->dealFlag = 'clean'
  142.   $this->run(); 
  143.   echo 'clean success'
  144.  } 
  145.  protected function success(){ 
  146.  } 
  147.  protected function error($errorMsg){ 
  148.   echo $errorMsg
  149.   exit(); 
  150.  } 
  151.  protected function setDirFilesVersion($dir){ 
  152.   $handle = null; 
  153.   $file  = null; 
  154.   if ( $handle = opendir($dir)) { 
  155.    while ( false !== ($file = readdir($handle)) ) { 
  156.     if ($file === '.' || $file === '..' || strpos($file'.') === -1 ) {continue;} 
  157.     $this->setFileVersion($file); 
  158.    } 
  159.   } 
  160.  } 
  161.  protected function setFileVersion($file){ 
  162.   $temp = null; 
  163.   /*$pattern = '/<script.*?src=\"(.*?)(\?.*?|\?)?\".*?><\/script>/';*/ 
  164.   $temp = explode('.'$file) ; 
  165.   if ( ! $this->isNeedReplacePostFix(array_pop$temp )) ) {return;} 
  166.   $content = null; 
  167.   $content = file_get_contents($file); 
  168.   $content = preg_replace_callback('/<script.*?><\/script>/'array(&$this'callbackScript'), $content); 
  169.   $content = preg_replace_callback('/<link.*?type="text\/css".*?>/'array(&$this'callbackCss'), $content); 
  170.   // highlight_string($content); 
  171.   file_put_contents($file$content); 
  172.  } 
  173.  /** 
  174.   * 获得版本 
  175.   * @param mixed $configs array( 'versionName' : 'version') || $versionName 
  176.   */ 
  177.  protected function setVersion($configs){ 
  178.   // last_wap_version  = '3-0-0',  
  179.   // wap_version = '3-0-1', 
  180.   if (is_array($configs) && $configs > 0) { 
  181.    foreach ($configs as $key => $value) { 
  182.     $this->version = $value
  183.     $this->versionName = $key
  184.    } 
  185.   }else if(is_string($configs) && $configs != ''){ 
  186.    $configs = explode(','$configs); 
  187.    $this->versionName = $configs[0]; 
  188.    count($configs) == 2 && ($this->version = $configs[1]); 
  189.   }else
  190.    $this->error('the version is empty'); 
  191.   } 
  192.  } 
  193.  /** 
  194.   * 通过后缀判断该文件是否要添加或清除版本 
  195.   * @param string $profix 后缀 
  196.   * @return boolean  true | false 
  197.   */ 
  198.  protected function isNeedReplacePostFix($profix){ 
  199.   if (in_array($profix$this->filePostFixs)) { 
  200.    return true; 
  201.   } 
  202.   return false; 
  203.  } 
  204.  /** 
  205.   * 设置需要操作的后缀 
  206.   */ 
  207.  public function setFilePostFix($profix){ 
  208.   if (is_array($profix)) { 
  209.    count($profix) > 0 && ( $this->filePostFixs = array_merge($this->filePostFixs, $profix) ); 
  210.   }else if(is_string($profix)){ 
  211.    $this->filePostFixs[] = $profix
  212.   } 
  213.  } 

使用:

  1. $dir  = __DIR__; 
  2. $is_clean = false; 
  3. //$is_clean = true; 
  4. //第一个参就是版本信息, 第二个就是要匹配的文件后缀, 第三个是要匹配的目录或者文件 
  5. if ($is_clean) {//清除版本 
  6.  $configs = 'eslc-wap'
  7.  $replaceObj = new ReplaceVersion($configsarray('html'), $dir); 
  8.  $replaceObj->clean(); 
  9. }else{//添加或替换版本 
  10.  $configs = array('eslc-wap' => '1.0.1');//也可以写成 $configs = 'eslc-wap, 1.0.1'; 
  11.  $replaceObj = new ReplaceVersion($configsarray('html'), $dir); 
  12.  $replaceObj->replace(); 
  13. }

Tags: php版本号 js css

分享到: