php在线压缩打包rar并自动下载文件的例子
linux需开启zlib。下面是具体的开启方法
1. 下载安装zlib
http://www.gzip.org/zlib/
解压tar包,进入目录执行命令:
./configure && make && make install
2. 添加php扩展,命令如下:
[root@Ansen zlib]# pwd
/root/lnmp/php-5.3.0/ext/zlib #php源码包目录
[root@Ansen zlib]#mv config0.m4 config.m4
[root@Ansen zlib]#/usr/local/php5/bin/phpize
[root@Ansen zlib]#./configure --with-php-config=/usr/local/php/bin/php-config
[root@Ansen zlib]#make
[root@Ansen zlib]# cp modules/zlib.so /usr/local/php/lib/php/extension/ #php扩展目录
[root@Ansen zlib]#vi /usr/local/php5/lib/php.ini
添加extension=zlib.so
3.重启apache
php 在线压缩打包rar代码
<?php
$filename = "./zip/" . date ( 'YmdH' ) . ".zip"; // 生成的压缩包名称(含路径)
// 生成文件
$zip = new ZipArchive (); // linux需开启zlib,
if ($zip->open ( $filename, ZIPARCHIVE::CREATE ) !== TRUE) {
exit ( '无法打开文件,或者文件创建失败' );
}
$fileNameArr = array('/upload/20140606/20140606011813-0.jpg','/upload/20140606/20140606013717-0.jpg');
foreach ( $fileNameArr as $val ) {
$zip->addFile ( $val, basename ( $val ) ); // 第二个参数是放在压缩包中的文件名称,要检查一下文件是否已经有了
}
$zip->close (); // 关闭
//发送到浏览器提示下载;
header ( "Cache-Control: max-age=0" );
header ( "Content-Description: File Transfer" );
header ( 'Content-disposition: attachment; filename=' . basename ( $filename ) ); // 文件名
header ( "Content-Type: application/zip" ); // zip格式的
header ( "Content-Transfer-Encoding: binary" ); // 告诉浏览器,二进制文件
header ( 'Content-Length: ' . filesize ( $filename ) ); // 告诉浏览器,文件大小
readfile ( $filename );//输出文件;
?>
一、简单的单条件查询
工作都是从简单的开始,先从最简单的单表查询开始,这个一般用在首页以及一些比较独立的页面,只需要查找几个符合条件的产品展示出来即可,可以使用分页或者不使用分页。下面这个是产品控制器 ProductController 中的一个函数,用于简单的查询,比如199元专区就可以使用 getTypeSimPro('price=199');
/**简单的筛选条件分类产品,单表查询
* @param string $sql 单表查询的SQL
* @param int $countPerPage=16 每页商品数
* @param string $orderBy='salseF DESC' 排序 默认销量阈值
* @return array $res 产品二维数组
*/
function getTypeSimPro($sql, $countPerPage = 16, $orderBy='salesF DESC'){
//$sql = "SELECT ProductId,name,mainPic,priceN,priceVIP,isNew,isHot,sales FROM product WHERE ".$sql;
$productM = M('product'); // 实例化Data数据对象
$where = $sql ? 'onSale=1 AND '.$sql : 'onSale=1';
$tempSQL = $productM->field('ProductId,name,mainPic,priceN,priceVIP,isNew,isHot,sales,salesF')
->where( $where )
->order( $orderBy );
// $res = $this->executeTempSQL($tempSQL, $countPerPage);
$res = $tempSQL->select(); //演示不使用分页,直接返回结果集
return $res;
}
二、使用分页
由于Thinkphp的自带Page分页类有些不太好用,所以我进行了一点小改造,可以进行传递配置参数修改页码显示的方式。这里的主要实现逻辑是:
1、利用同一个临时数据库对象 $tempSQL ,使计数和查询结果的条件保持一致,注意这里使用了对象克隆,因为TP中,一个Model执行完操作后会被初始化成原始的Model对象,参见 TP手册连贯操作说明>> 。
2、$_GET['p']是Page类默认的辨别当前页码的参数。Page类尤其里面的 show() 函数是经过我改造的,可以传递定制化页码导航栏参数。不定制也可以,就是页码导航有点太长。
3、这里的 count() 在后面多表查询的时候是有BUG的,后面再说。
/**
* 执行分类和搜索中的SQL对象
* @param TP.Model $tempSQL Thinkphp的Model对象
* @param int $countPerPage=16 每页的产品数
* @return array $res['nowP']当前页数 $res['totalP']总产品数 $res['links']分页栏HTML $res['productList']产品二维数组
* */
protected function executeTempSQL( $tempSQL, $countPerPage=16 ){
$tempSQL2 = clone $tempSQL; //对象复制,否则调用一次后第二次会被初始化成原始的M对象
// print_r($tempSQL);
$count = $tempSQL->count(); // 查询满足要求的总记录数,这里在多表查询时一定要以产品编号为限制条件
// var_dump($count);
// var_dump($tempSQL);
$nowPage = isset($_GET['p'])?$_GET['p']:1; //当前页
import('ORG.Util.Page');// 导入分页类
$Page = new \Think\Page($count,$countPerPage); // 实例化分页类 传入总记录数,每页数
$list = $tempSQL2->page($nowPage.','.$Page->listRows)->select(); //查询结果集
// var_dump($list);
//分页导航的定制
$showConfig = array(
'first' => '首页',
'prev' => '上一页',
'next' => '下一页',
// 'last' => '尾页', //这个不行
'rollPage' => 5, //最多显示5页导航
);
$links = $Page->show( $showConfig ); // 分页显示输出
//var_dump($links);
//var_dump($list);
$res['nowP'] = $nowPage;
$res['totalP'] = $count;
$res['links'] = $links; //分页输出
$res['productList'] = $list; //数据集
return $res;
}
三、多表查询功能概览
先来一张截图,要达到的筛选功能大概是这个样子的。
其中的数据库设计为:
product表:ProductId-产品ID、name-产品名、sort1-一级分类、sort2-品牌分类、price-价格、onSale-上下架……等等
reserve表:ProductId-产品ID、color-颜色、size-尺码、reserve-库存
tagpro表:Id-自增没实际用途、tagId-标签ID、ProductId-产品ID
tag表:Id-标签ID、tag_name-标签名
标签与产品是多对多的关系。在上面展示的分类和搜索中,黑色导航栏、性别以及以后可能扩展的筛选项为标签联表查询,尺码为库存表联表查询。
四、SearchController控制器
定义了一个Search控制器,里面有下面几个方法:
function index() 方法是根据上面页面中的筛选选项拼装相应的SQL语句的,提交到ProductController去筛选出相关的产品;
function getCutURL($getKey, $CtrlName=CONTROLLER_NAME) 是为了给页面生成一系列切除了指定get值的URL地址的;
function pageCheck() 如果改变了筛选条件,则去除页码参数,回到从第一页开始;
在我的项目规划中IndexController负责页面的显示,所以IndexController中的 search() 方法则负责搜索页面的展示,代码如下
function search(){
$searchC = A('search');
$res = $searchC->index();
$URLArr['type2URL'] = $searchC->getCutURL('type2'); //取消选择分类的URL
$URLArr['brandURL'] = $searchC->getCutURL('brand'); //取消选择品牌的URL
$URLArr['peopleURL'] = $searchC->getCutURL('people'); //取消选择性别人群的URL
$URLArr['sizeURL'] = $searchC->getCutURL('size'); //取消选择尺码的URL
$URLArr['priceURL'] = $searchC->getCutURL('price'); //取消选择价格区间的URL
$URLArr['keyword'] = $searchC->getCutURL('keyword'); //取消搜索关键字的URL
$URLArr['orderbyURL'] = $searchC->getCutURL('orderby'); //orderby按钮的URL前部分
$this->assign('URLArr', $URLArr)
->assign ( 'productArr', $res['productList'] )
->assign( 'totalNum', $res['totalP'] )
->assign( 'pageinfo', $res['links'])
->display();
}
五、两表多次查询
因为产品与标签是多对多的关系,所以有一种需求是:查询同时拥有两个标签一个产品,姑且设读取列为*即全部列。
一开始想到的SQL语句是这个样子的
SELECT * FROM product p INNER JOIN tagpro ON tagpro.ProductId = p.ProductId INNER JOIN tagpro ON tagpro.ProductId = p.ProductId WHERE onSale=1 AND tagpro.tagId=46 AND tagpro.tagId=40;
然而这条语句并没有执行成功,而是报错 Not unique table/alias: 'tagpro' ,意思是说两次INNER JOIN的表是同一个表/表别名,所以不行。所以我就试着把一个INNER JOIN删掉,然后再看是可以执行了,但是却是没有查到任何结果。到这里,我差点就要骂SQL不够智能了,明明是该产品在tagpro表中有tagId等于46也有tagId等于40,为什么你要理解成了 tagId同时等于46和40呢?
SELECT * FROM product p INNER JOIN tagpro ON tagpro.ProductId = p.ProductId WHERE onSale=1 AND tagpro.tagId=46 AND tagpro.tagId=40;
骂也没用,只能再想办法,相信这种事情很多人都遇到,SQL肯定有办法解决这种问题,后来尝试了一下这种写法,把同一个表分别用了两个不同的别名,然后终于能查出来了。 ???
SELECT * FROM product p INNER JOIN tagpro a ON a.ProductId = p.ProductId INNER JOIN tagpro b ON b.ProductId = p.ProductId WHERE onSale=1 AND a.tagId=46 AND b.tagId=40;
六、产品控制器中的SQL查询函数
前面说了,Search控制器中的index()方法负责拼接SQL语句,提交到 Product控制器中进行产品的查询,现在在Product控制器中新建一个 getSearchPro() 方法,参考原来简单查询中的做法,另外加入JOIN的处理。这里其实就是把 where拼接起来, 把 join 拼接起来。原始的where和join的生成在Search控制器的index()中。
/**根据筛选条件查找分类产品,多表查询 //默认每页16 //排序为销售阈值
* @param string $sql 单表查询的SQL
* @param int $countPerPage=16 每页商品数
* @param string $orderBy='salseF DESC' 销量阈值
* @param array $joinConfig=NULL 多表查询时
* $joinConfig['joinTable']为联合表名二维数组,每一列遍历为 $joinTableL
* $joinTableL[name]为真实表名 $joinTableL[asname]为as表名
* $joinConfig['where']为附加查询条件as表名的字段=条件 $joinTableL[asname].size=$size;
* @return array $res['nowP']当前页数 $res['totalP']总产品数 $res['links']分页栏HTML $res['productList']产品二维数组
*/
function getSearchPro($sql, $countPerPage = 16, $orderBy='salesF DESC', $joinConfig=NULL){
$productM = M('product')->alias('p'); // 实例化Data数据对象
$where = $sql ? 'p.onSale=1 AND '.$sql : 'p.onSale=1';
$joinTableArr = $joinConfig['joinTable']; //要JOIN的表名
$joinWhereArr = $joinConfig['where']; //要筛选的格外条件
foreach( $joinWhereArr as $joinLine ){
$where .= ' AND '.$joinLine;
}
$tempSQL = $productM->distinct(true)
->field('p.ProductId,p.name,p.mainPic,p.priceN,p.priceVIP,p.isNew,p.isHot,p.sales,p.salesF')
->where( $where )
->order( $orderBy );
//处理JOIN
foreach( $joinTableArr as $joinTableL){
$tempSQL = $tempSQL->join("$joinTableL[name] AS $joinTableL[asname] ON $joinTableL[asname].ProductId = p.ProductId");
}
$res = $this->executeTempSQL($tempSQL, $countPerPage, 'p.ProductId');
return $res;
}
注意最后的 $res = $this->executeTempSQL($tempSQL, $countPerPage, 'p.ProductId'); 最后比之前的函数多了一个参数,因为前文提到的 executeTempSQL()方法中的 $count = $tempSQL->count(); 改为了 $count = $tempSQL->count('DISTINCT '.$countCond); 否则在多表查询时计数会出现count的数量比实际查到的结果条数多的情况。 这里的executeTempSQL()后面新增的参数为 $countCond,默认值为'ProductId',以便单表查询时不必填写这个无相紧要的参数。
七、Search控制器,筛选项转换成SQL拼接
index()函数:生成查询的SQL语句段。逻辑是:
1、根据 get 的参数,分别依次进行筛选/排序处理;
2、只在product表中产生where条件的,以一次查询加 简单where SQL拼接的方式处理;
3、多表联合并在其它表有 where条件的,以 join 数组的形式提交给产品控制器统一拼接处理;
4、这个是目前现行的方案,以后还要再优化的;
//搜索入口
function index( $defaultTag=NULL ){
//如果改变了筛选条件,则去除页码参数
$this->pageCheck();
//********处理筛选**********************************
$type2 = I('get.type2'); // type2: 篮球鞋、跑步鞋……
$brand = I('get.brand'); // brand: 阿迪、匹克、李宁……
$people = I('get.people'); // people: 男、女、中性……
$size = I('get.size'); // size: 35~46、S~L……
$price = I('get.price'); // price: 小于99、100~199……
$tag = I('get.tag'); // tagsId: 限时、热销、性价比……
$keyword = trim( I('get.keyword') );// keyword: 搜索关键字……
$orderby = I('get.orderby');
$joinTableNameIndex = 0; //join所用的表替代名称后缀,为了两个表多次联合查询而设计所有的join表as tb0、tb1...
//例如 SELECT * FROM product p INNER JOIN tagpro tb0 ON tb0.ProductId = p.ProductId INNER JOIN tagpro tb1 ON tb1.ProductId = p.ProductId WHERE onSale=1 AND tb0.tagId=46 AND tb1.tagId=40;
$sql = '';
//二级分类: /type2/篮球鞋
if( $type2 ){
$type2Id = M()->query("SELECT Id FROM sort WHERE sortName='$type2'");
$type2Id = $type2Id[0]['Id'];
$thesql = "p.sort_secType='$type2Id'";
$sql = $sql ? $sql.' AND '.$thesql : $thesql;
}
//品牌筛选: /brand/李宁
if( $brand ){
$brandId = M()->query("SELECT Id FROM sort WHERE sortName='$brand'");
$brandId = $brandId[0]['Id'];
$thesql = "(p.sort_brand='$brandId' OR p.name LIKE '%$brand%')"; //这里除了品牌分类匹配外还根据商品名称模糊匹配
$sql = $sql ? $sql.' AND '.$thesql : $thesql;
}
//性别: /people/男性 /people/女性 /people/中性
if( $people ){
//人群标签ID
$tagsPeopleId = M('tags')->where("tag_name='$people'")->field('Id')->select();
$tagsPeopleId = $tagsPeopleId[0]['Id'];
$join['joinTable'][] = array('name'=>'tagpro', 'asname'=>'tb'.$joinTableNameIndex );
$join['where'][] = 'tb'.$joinTableNameIndex.'.tagId='.$tagsPeopleId ;
$joinTableNameIndex++;
// $sql = $sql ? $sql.' AND '.$thesql : $thesql;
}
//营销标签(与人群标签一样处理逻辑)
if( $tag ){
$tagsId = M('tags')->where("tag_name='$tag'")->field('Id')->select();
$tagsId = $tagsId[0]['Id'];
$join['joinTable'][] = array('name'=>'tagpro', 'asname'=>'tb'.$joinTableNameIndex );
$join['where'][] = 'tb'.$joinTableNameIndex.'.tagId='.$tagsId ;
$joinTableNameIndex++;
// $sql = $sql ? $sql.' AND '.$thesql : $thesql;
}
//尺码筛选: /size/35
if( $size ){
$join['joinTable'][] = array('name'=>'reserve', 'asname'=>'tb'.$joinTableNameIndex );
$join['where'][] = 'tb'.$joinTableNameIndex.'.size='.$size ;
$joinTableNameIndex++;
// $join['joinTable'][] = 'reserve';
// $join['where'][] = 'reserve.size='.$size ;
// $sql = $sql ? $sql.' AND '.$thesql : $thesql;
}
//价格筛选: /price/100~199 /price/大于1999 /price/小于99
if( $price ){
// var_dump( $price );
if( preg_match('/~/', $price) ){ // echo '介于';
$priceArr = explode('~', $price);
$thesql = "p.priceVIP BETWEEN '$priceArr[0]' AND '$priceArr[1]'";
}elseif( preg_match('/大于/', $price) ){ // echo '大于';
$priceArr = explode('大于', $price);
$thesql = "p.priceVIP>'$priceArr[1]'";
}elseif( preg_match('/小于/', $price) ){ // echo '小于';
$priceArr = explode('小于', $price);
$thesql = "p.priceVIP<'$priceArr[1]'";
}
$sql = $sql ? $sql.' AND '.$thesql : $thesql;
}
//搜索关键字
if( $keyword ){
$thesql = "(p.ProductId LIKE '%$keyword%' OR p.name LIKE '%$keyword%')";
$sql = $sql ? $sql.' AND '.$thesql : $thesql;
}
//排序
if( $orderby ){
if( $orderby == 'default'){
$orderbySQL = NULL;
}elseif( $orderby == 'priceVIPa' ){
$orderbySQL = 'priceVIP ASC';
}elseif( $orderby == 'priceVIPd' ){
$orderbySQL = 'priceVIP DESC';
}else{
$orderbySQL = $orderby.' DESC';
}
}
//*******************************************
$productC = A('DataProduct');
$res = $productC->getSearchPro($sql,20,$orderbySQL,$join);
// var_dump($res);
return $res;
}
Search 控制器下的另外两个函数如下:
/**
* 如果改变了筛选条件,则去除页码参数,回到从第一页开始
* 实现原理:如果存在p参数且不是最后一个参数时,则认为是修改了筛选条件
* 这里有一点BUG,多项选择再翻页时、取消一个选项并不会回到第一页(因为p参数还是在最后)
*/
function pageCheck(){
// var_dump( $_SERVER['HTTP_REFERER'] );
// var_dump( $_GET );
$getKeyArr = array_keys( $_GET ); //var_dump($getKeyArr);
$pKeyIndex = array_search('p', $getKeyArr);
// var_dump($pKeyIndex);
$arrL = sizeof($getKeyArr); //var_dump($getKeyArr);
if( $pKeyIndex!==FALSE && $pKeyIndex+1 < $arrL ){ //p参数如果不是在最后则为更改了筛选条件
$cutPurl = $this->getCutURL('p');
redirect( $cutPurl );
}
}
/**
* 获得切除了指定get值的URL
* @param string $getKey 要去除的get键
* @param string $CtrlName 控制器名,默认为页面URL中的控制器名
* @return string 不含http://域名 的URL,可直接用于前端输出
* */
function getCutURL($getKey, $CtrlName=CONTROLLER_NAME){
$getStr ='';
$getArr = I('get.');
unset($getArr[$getKey]);
foreach( $getArr as $getKey=>$getVal){
$getStr .= '/'.$getKey.'/'.$getVal;
}
// var_dump($getStr);
$thisURL = rtrim( U("$CtrlName/search"), 'html');
$thisURL = rtrim($thisURL, '.'); //这两句合并起来会出问题,把seach中的h也去掉了
return $thisURL.$getStr;
}
在设计的 php 生成静态页面中,静态页面越来越多,在不断的执行生成 html 的过程中,效率越来越慢,所以优化 php 语句就变得刻不容缓了,先检查了自己之前写的 php 生成 html 的程序,原来就是直接的循环,没有附加任何的优化,先看一下夏日博客之前的 PHP 循环语句:
$stat = time(); for($i=1;$i<=10000;$i++){ $strTemp = $strTemp."<option value='".$i."'"; $strTemp=$strTemp.">第".$i."页</option>"; } $end = time(); echo $end-$stat;
这个循环只是把 php 生成静态语句给简化来了,主要了解一下循环生成的效率时间,具体的生成 html 这里就不具体讲解了,可以参看以前夏日博客的文章,这里是使用 php 执行循环 10000 次,如果变成 10000 00 之后呢,循环的速度会越来越慢,echo 出来的秒数也会越来越大,最后的解决方法就是将这段 PHP 循环语句进行简单的改造,如下:
$stat = time(); $strTemp = ''; for($i=1;$i<=10000;$i++){ $strTemp .= "<option value='".$i."'"; $strTemp .= ">第".$i."页</option>"; } $end = time(); echo $end-$stat;
再次运行,不需要一秒的时间,时间效率非常的快,通过两段代码的对比可以看出,第一段是在每执行一次循环再重新赋值,要赋值 10000 次,速度肯定会慢,而第二段代码则是通过 点 的符号将值直接连接成一个字符串,只进行一次赋值就可以了,所以效率很高,我们可以把后面的代码放在任何执行多次的循环语句中,比如 php 生成多条 html 的时候。
实现代码如下:
<?php $Stime=0; $Etime=0; $Ttime=0; $Stime=microtime(true);//获取程序开始执行的时间 //echo $Stime."<br/>"; for ($i=1;$i<=10000000;$i++){} //为了实现有一定的时间差,所以用了一个FOR来消耗一些资源. $Etime=microtime(true);//获取程序执行结束的时间 //echo $Etime."<br/>"; $Ttime=$Etime-$Stime;//计算差值 //echo $Ttime."<br/>"; $str_total=var_export($Ttime,TRUE); if(substr_count($str_total,"E")){ //为了避免1.28746032715E-005这种结果的出现,做了一下处理. $float_total=floatval(substr($str_total,5)); $Ttime=$float_total/100000; } echo $Ttime.'秒'; ?>
百恒开发工程师在对相关函数进行介绍:
microtime() 函数返回当前 Unix 时间戳和微秒数。
var_export() 函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。
substr_count() 函数计算子串在字符串中出现的次数。
备注:南昌网站制作公司工程师提醒广大开发人员:$Stime=microtime(true);要放在页面的首要位置,$Etime=microtime(true);要放页面的未位置,否则计算不出时间.
<?php header("Content-type: text/html; charset=utf-8"); /** * 将字符串转换成二进制 * @param type $str * @return type */ function StrToBin($str){ //1.列出每个字符 $arr = preg_split('/(?<!^)(?!$)/u', $str); //2.unpack字符 foreach($arr as &$v){ $temp = unpack('H*', $v); $v = base_convert($temp[1], 16, 2); unset($temp); } return join(' ',$arr); } /** * 讲二进制转换成字符串 * @param type $str * @return type */ function BinToStr($str){ $arr = explode(' ', $str); foreach($arr as &$v){ $v = pack("H".strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16)); } return join('', $arr); } echo StrToBin("php二次开发:www.111cn.net");; echo '<br/>'; echo BinToStr("1110000 1101000 1110000 111001001011101010001100 111001101010110010100001 111001011011110010000000 111001011000111110010001 111011111011110010011010 1110111 1110111 1110111 101110 1110000 1101000 1110000 110010 101110 1100011 1100011");字符串截取我们这里有简单的办法,通常如果只对于简单的可以使用substr函数了,如果要删除字符串中的字符我们也可以使用substr函数了,下面来看看。
修复了一个获取控制器名称方法的bug
控制器的名称都是使用act结尾,使用过程中要删除act。
1。原来的方法
//使用替换act的方法获取控制器名称,很显然当控制器的名称出现act三个字符的时候都会被替换掉产生bug $actName = str_replace( 'act', '', 'ad_client_contactact');
控制器名称 ad_client_cont
2。修复后的方法
//从结尾删除三个字符串
$actName = substr('ad_client_contactact',0,-3);
控制器名称ad_client_contact
1、从第4个字符开始截取到字符串末尾,类似asp中的left:
<?php $str = "www。icoa。cn"; echo substr($str,4); ?> 输出: icoa。cn
2、PHP substr函数从右边截取3个字符,类似asp中的right:
<?php $str = "www。icoa。cn"; echo substr($str,-3); ?> 输出:。cn
3、PHP substr函数从第4个字符开始截取3个字符:
<?php $str = "www。icoa。cn"; echo substr($str,4,3); ?> 输出:ico
4、有时我们知道一个字符串的开始和结尾,中间是不定长的字符,这时除了用PHP substr函数的正则外我们还可以用substr实现(当然要得到中间的字符方法有N种,在此只是举例substr的应用):
本例去掉开头4个字符和结尾3个字符,输出中间的字符串:
<?php $str = "www。icoa。cn"; echo substr($str,4,-3); ?> 输出:icoa
5、对中文看看
$a="直的、竖的、横的、方的、" $a=substr($a,0,-1); 输出结果为:直的、竖的、横的、方的
6、查找指定字符串并删除
$a = "abcababa"; $count=strpos($a,"ab"); $str=substr_replace($a,"",$count,2); 输出结果:cababa
代码虽短,但也算是一个小算法!
7、删除字符串中任何字符的函数
function delStr($start, $end, $orgenStr) { //读取要删除字符位置的前一部分字符串,并赋值给$temp //strpos读取字符第一次出现的位置 //substr读取指定开始与结束位置的子字符串 //echo $before."—". $last; $temp=$orgenStr; while(strpos($temp, $start) && strpos($temp, $end)){ $temp=substr($temp, 0, strpos($temp, $start)).substr($temp,strpos($temp, $end)+strlen($end));; //读取要删除字符位置的后一部分字符串,然后将前后部分连接,并赋值给$temp //返回最后是字符串 } return $temp; } //应用实例 $a="aaaa12345678bbbbtttttttttttttttttttttaaaa12345678bbbb kkkkkkkkkkkkaaaa12345678bbbbttttttttttttttttttttt"; $b="1234"; $c="5678"; echo delStr($b,$c,$a);
相关文章
- 安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
- 这篇文章主要介绍了Go语言压缩和解压缩tar.gz文件的方法,实例分析了使用Go语言压缩文件与解压文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
- 这篇文章主要介绍了MyBatis-Plus自动填充功能失效导致的原因及解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
- 这篇文章主要介绍了C#实现延时并自动关闭MessageBox的方法,非常实用的功能,需要的朋友可以参考下...2020-06-25
- floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
- 利用php实现将文件批量压缩打包下载,这个过程中将使用到 ZipArchive 这个类,注意使用该类之前,linux需开启zlib,windows需取消php_zip.dll前的注释。下面直接给出一个简单的将文件压缩为 zip 格式的示例。具体用法请查询p...2015-10-30
- 这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
- 这篇文章主要给大家介绍了关于微信小程序对图片进行canvas压缩的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-12
- 这篇文章主要介绍了C#自定义字符串压缩和解压缩的方法,通过自定义C#字符串操作类实现对字符串的压缩与解压的功能,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要给大家介绍了关于如何利用Redis如何实现自动补全功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-04-17
C# 利用ICSharpCode.SharpZipLib实现在线压缩和解压缩
本文主要主要介绍了利用ICSharpCode.SharpZipLib第三方的DLL库实现在线压缩和解压缩的功能,并做了相关的代码演示。...2020-06-25- 下面我们来看一篇关于纯Css实现下拉菜单的简单例子,希望这篇文章能够给各位同学带来帮助,具体步骤如下. 大家可能会经常用到hover这属性,用hover实现鼠标经过的颜...2017-01-22
- 这篇文章主要介绍了Linux下常用压缩格式的压缩与解压方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要给大家介绍了关于MySQL自动停机的问题处理,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-01
- 这篇文章主要介绍了vue在图片上传的时候压缩图片,帮助大家缓解服务器压力,提高程序性能,感兴趣的朋友可以了解下...2020-11-18
- PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法这里就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流。这里整理一下利用php zipA...2015-10-30
- 在php中日期对比用得比较多了,还有一个日期加减也用到不少,下面我拿两个例子来给大家介绍在php中日期操作方法吧,希望文章能给你带来帮助 功能需求 文章发布时段操...2016-11-25
- 本文实例讲述了php压缩和解压缩字符串的方法。...2015-03-15
- 本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25
- 正则提取图片中的地址我们介绍过很多的相关文章了,下面再来给各位介绍一个可以提取内容中第一张图片的例子,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25