如何使用php脚本给html中引用的js和css路径打上版本号,jscss_PHP教程
如何使用php脚本给html中引用的js和css路径打上版本号,jscss
在搜索引擎中搜索关键字.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写了个类
//生成版本 //清除版本 class ReplaceVersion{ protected $filePostFixs = array(); protected $versionName = null; protected $version = null; protected $path = null; /** * @param mixed $configs * @param [type] $profix [description] * @param [type] $path [description] */ public function __construct($configs, $profix, $path){ if (!$this->isCanRun()) { $this->error('必须在内网环境 10.10.0开头才可运行'); //exit; } $this->setVersion($configs); $this->setFilePostFix($profix); $this->path = $path; } protected function isCanRun(){ if (strpos($_SERVER['HTTP_HOST'], '10.10.0') !== false) { return true; } return false; } /** * 匹配到script节点 * @param array $match 匹配到的script * @return string 处理好的script */ protected function callbackScript($match){ //["<script src="../js/config.js?is=new"></script>", "../js/config.js", "?is=new"] /*/<script.*?src=\"(.*?)(\?.*?|\?)?\".*?><\/script>/*/ $str = $match[0]; $pattern = '/(<script.*?src=\")(.*)?(\"><\/script>)/'; return $this->callbackMatch($str, $pattern); } /** * 匹配到css节点 * @param array $match 匹配到的css * @return string 处理好的css */ protected function callbackCss($match){ // '<link rel="stylesheet" type="text/css" href="../css/globel.css">'; $str = $match[0]; $pattern = '/(<link.*?href=\")(.*)?(\".*?>)/'; return $this->callbackMatch($str, $pattern); } /** * 回调模式匹配 * @param string $str * @param string $pattern * @return string */ protected function callbackMatch($str, $pattern){ switch ($this->dealFlag) { case 'replace': return $this->replaceCallbackMatch($str, $pattern); case 'clean': return $this->cleanCallbackMatch($str, $pattern); default: $this->error('非法模式'); } } /** * 替换版本 * @param string $str 待处理的string * @param string $pattern 正则 * @return string 处理后的string */ protected function replaceCallbackMatch($str, $pattern){ if (!preg_match($pattern, $str, $third)) { return $str; } $arr = explode('?', $third[2]); $len = count($arr); $versionName = $this->versionName; $version = $this->version; if ($len === 1) {//没有问号 $arr[0] .= '?'. $versionName. '='. $version; }else{//有问号 if (preg_match('/(^|\&)'. $versionName.'=(.*?)($|\&)/', $arr[1])) {//存在 $arr[1] = preg_replace('/(^|\&)'. $versionName.'=(.*?)($|\&)/', '$1'. $versionName.'='. $version. '$3', $arr[1]); $arr[0] .= '?'. $arr[1]; }else{//不存在 $arr[0] .= '?'. $arr[1]. '&'. $versionName. '='. $version; } } return $third[1]. $arr[0]. $third[3]; } /** * 清除版本 * @param string $str 待清除的版本 * @param string $pattern 正则 * @return string 清除后的string */ protected function cleanCallbackMatch($str, $pattern){ if (!preg_match($pattern, $str, $third)) { return $str; } $arr = explode('?', $third[2]); $len = count($arr); $versionName = $this->versionName; if ($len > 1 && strpos($arr[1], $versionName. '=') !== false) { $arr[1] = preg_replace('/(^|\&)'. $versionName.'=(.*?)($|\&)/', '$1', $arr[1]); substr($arr[1], -1) === '&' && ($arr[1] = substr($arr[1], 0, -1)); $arr[0] .= strlen($arr[1]) > 0 ? '?'. $arr[1] : ''; $str = $third[1]. $arr[0]. $third[3]; } return $str; } /** * 执行 */ protected function run(){ if ($this->path == '') { $this->error('empty path'); return ; } if (is_dir($this->path)) { $this->setDirFilesVersion( $this->path ); }else if(is_file($this->path)){ $this->setFileVersion( $this->path ); }else{ $this->error('error path'); } } /** * 添加版本 */ public function replace(){ $this->dealFlag = 'replace'; $this->run(); echo 'replace success'; } /** * 清除版本 */ public function clean(){ $this->dealFlag = 'clean'; $this->run(); echo 'clean success'; } protected function success(){ } protected function error($errorMsg){ echo $errorMsg; exit(); } protected function setDirFilesVersion($dir){ $handle = null; $file = null; if ( $handle = opendir($dir)) { while ( false !== ($file = readdir($handle)) ) { if ($file === '.' || $file === '..' || strpos($file, '.') === -1 ) {continue;} $this->setFileVersion($file); } } } protected function setFileVersion($file){ $temp = null; /*$pattern = '/<script.*?src=\"(.*?)(\?.*?|\?)?\".*?><\/script>/';*/ $temp = explode('.', $file) ; if ( ! $this->isNeedReplacePostFix(array_pop( $temp )) ) {return;} $content = null; $content = file_get_contents($file); $content = preg_replace_callback('/<script.*?><\/script>/', array(&$this, 'callbackScript'), $content); $content = preg_replace_callback('/<link.*?type="text\/css".*?>/', array(&$this, 'callbackCss'), $content); // highlight_string($content); file_put_contents($file, $content); } /** * 获得版本 * @param mixed $configs array( 'versionName' : 'version') || $versionName */ protected function setVersion($configs){ // last_wap_version = '3-0-0', // wap_version = '3-0-1', if (is_array($configs) && $configs > 0) { foreach ($configs as $key => $value) { $this->version = $value; $this->versionName = $key; } }else if(is_string($configs) && $configs != ''){ $configs = explode(',', $configs); $this->versionName = $configs[0]; count($configs) == 2 && ($this->version = $configs[1]); }else{ $this->error('the version is empty'); } } /** * 通过后缀判断该文件是否要添加或清除版本 * @param string $profix 后缀 * @return boolean true | false */ protected function isNeedReplacePostFix($profix){ if (in_array($profix, $this->filePostFixs)) { return true; } return false; } /** * 设置需要操作的后缀 */ public function setFilePostFix($profix){ if (is_array($profix)) { count($profix) > 0 && ( $this->filePostFixs = array_merge($this->filePostFixs, $profix) ); }else if(is_string($profix)){ $this->filePostFixs[] = $profix; } } }
使用:
$dir = __DIR__; $is_clean = false; //$is_clean = true; //第一个参就是版本信息, 第二个就是要匹配的文件后缀, 第三个是要匹配的目录或者文件 if ($is_clean) {//清除版本 $configs = 'eslc-wap'; $replaceObj = new ReplaceVersion($configs, array('html'), $dir); $replaceObj->clean(); }else{//添加或替换版本 $configs = array('eslc-wap' => '1.0.1');//也可以写成 $configs = 'eslc-wap, 1.0.1'; $replaceObj = new ReplaceVersion($configs, array('html'), $dir); $replaceObj->replace(); }

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

vue.js에서 bootstrap 사용은 5 단계로 나뉩니다 : Bootstrap 설치. main.js.의 부트 스트랩 가져 오기 부트 스트랩 구성 요소를 템플릿에서 직접 사용하십시오. 선택 사항 : 사용자 정의 스타일. 선택 사항 : 플러그인을 사용하십시오.

WebDevelopmentReliesonHtml, CSS 및 JavaScript : 1) HtmlStructuresContent, 2) CSSSTYLESIT, 및 3) JAVASCRIPTADDSINGINTERACTIVITY, BASISOFMODERNWEBEXPERIENCES를 형성합니다.

HTML은 웹 구조를 정의하고 CSS는 스타일과 레이아웃을 담당하며 JavaScript는 동적 상호 작용을 제공합니다. 세 사람은 웹 개발에서 의무를 수행하고 화려한 웹 사이트를 공동으로 구축합니다.

React는 JSX와 HTML을 결합하여 사용자 경험을 향상시킵니다. 1) JSX는 개발을보다 직관적으로 만들기 위해 HTML을 포함시킨다. 2) 가상 DOM 메커니즘은 성능을 최적화하고 DOM 운영을 줄입니다. 3) 유지 보수성을 향상시키기위한 구성 요소 기반 관리 UI. 4) 상태 관리 및 이벤트 처리는 상호 작용을 향상시킵니다.

Bootstrap에 이미지를 삽입하는 방법에는 여러 가지가 있습니다. HTML IMG 태그를 사용하여 이미지를 직접 삽입하십시오. 부트 스트랩 이미지 구성 요소를 사용하면 반응 형 이미지와 더 많은 스타일을 제공 할 수 있습니다. 이미지 크기를 설정하고 IMG-Fluid 클래스를 사용하여 이미지를 적응할 수 있도록하십시오. IMG 통과 클래스를 사용하여 테두리를 설정하십시오. 둥근 모서리를 설정하고 IMG 라운드 클래스를 사용하십시오. 그림자를 설정하고 그림자 클래스를 사용하십시오. CSS 스타일을 사용하여 이미지를 조정하고 배치하십시오. 배경 이미지를 사용하여 배경 이미지 CSS 속성을 사용하십시오.

부트 스트랩 분할 라인을 만드는 두 가지 방법이 있습니다 : 태그를 사용하여 수평 분할 라인이 생성됩니다. CSS 테두리 속성을 사용하여 사용자 정의 스타일 분할 라인을 만듭니다.

부트 스트랩 프레임 워크를 설정하려면 다음 단계를 따라야합니다. 1. CDN을 통해 부트 스트랩 파일 참조; 2. 자신의 서버에서 파일을 다운로드하여 호스팅하십시오. 3. HTML에 부트 스트랩 파일을 포함; 4. 필요에 따라 Sass/Less를 컴파일하십시오. 5. 사용자 정의 파일을 가져옵니다 (선택 사항). 설정이 완료되면 Bootstrap의 그리드 시스템, 구성 요소 및 스타일을 사용하여 반응 형 웹 사이트 및 응용 프로그램을 만들 수 있습니다.
