PHP批量修改文件名称的方法分析
在这里我们利用一个战地自己写的一个例子来具体分析一下利用PHP批量修改文件名称的思路和注意事项。
从这个例子里你将会看到,PHP如何判断一个路径是不是目录,如何用PHP取得路径中的文件名称和文件的扩展名,随机函数rand的基本应用,以及这个程序的核心内容递归函数的基本应用。
程序功能:利用PHP目录和文件函数遍历用户给出目录的所有的文件和文件夹,修改文件名称;
首先判断用户给出的目录是不是一个合法目录;
我们这里只是修改狭义的文件名称(不包括目录),所以在程序中一定要判断是不是目录,如果是目录我们就打开这个目录——从而实现遍历目录下的所有文件。如果不是我们就用一个随机的名称修改原来的文件名(用随机数做名称其实不科学,但是这不是我们的重点)。
具体的程序如下:
代码如下 | 复制代码 |
<?php //利用PHP目录和文件函数遍历用户给出目录的所有的文件和文件夹,修改文件名称 functionfRename($dirname){ if(!is_dir($dirname)){ echo"{$dirname}不是一个有效的目录!"; exit(); } $handle= opendir($dirname); while(($fn= readdir($handle))!==false){ if($fn!='.'&&$fn!='..'){ $curDir=$dirname.'/'.$fn; if(is_dir($curDir)){ fRename($curDir); } else{ $path=pathinfo($curDir); $newname=$path['dirname'].'/'.rand(0,100).'.'.$path['extension']; rename($curDir,$newname); echo$curDir.'---'.$newname." } } } } //给出一个目录名称调用函数 fRename('pl'); ?> |
程序分析:
第4行我们用is_dir函数来判断用户给出的目录是不是一个有效的目录名称;因为我们是学习所以写的简单一点如果你要放在服务器上供大家使用的话,你一定要谨慎的验证这个输入数据——例如,这个目录是否允许用户修改等等……
注意函数第9行的判断,必须用全等判断(PHP全等符号===三个等号,不全等!==一个叹号两个等号),否则如果有一个文件名称为0(零),会导致程序意外终止;
第12行,如果读取的文件是一个目录,就在此调用函数本身,实现函数的递归;
注意第16行pathinfo函数的用法,这个函数返回一个拥有三个元素的数组三个元素分别是:
Dirname路径的目录名称,basename路径包含的文件名称 和 extension文件的扩展名,具体这个函数的用法请参看手册相关部分。
小编给大家推荐的这篇文章介绍了php自定义截取中文字符串-utf8版的教程,非常实用,有兴趣的同学快来看看吧。先说明:网上目前有很多这个问题的代码,但是很多都是复制粘贴,没有自己实践,而且代码有逻辑问题,下面的代码由我自己编写。
话不多说
代码如下 | 复制代码 |
/** * 该函数是对于utf8编码 * @author 2582308253@qq.com * @param string $str * @param int $start * @param int $length * @return string * @copyright 2017年2月27日下午1:46:10 */ functiongbsubstr2($str,$start,$length) { $length=abs($length); $strLen=strlen($str); $len=$start+$length; $newStr='' for($i=$start;$i<$len&&$i<$strLen;$i++) { if(ord(substr($str,$i, 1)) > 0xa0) { //utf8编码中一个汉字是占据3个字节的,对于其他的编码的字符串,中文占据的字节各有不同,自己需要去修改这个数a $newStr.=substr($str,$i, 3);//此处a=3; $i+=2; $len+= 2;//截取了三个字节之后,截取字符串的终止偏移量也要随着每次汉字的截取增加a-1; }else{ $newStr.=substr($str,$i, 1); } } return$newStr; } |
小编给大家推荐的这篇文章介绍了php实现通过soap调用.Net的WebService asmx文件的教程,非常实用,有兴趣的同学快来看看吧。
最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各种探索,相关的PHP调用webservice的过程如下:
1.打开php相关扩展:
找到配置文件php.ini 文件, 打开以下扩展
extension = php_soap.dll
extension = php_curl.dll
extension = php_openssl.dll
2.php代码如下:
代码如下 | 复制代码 |
<?php header("content-type:text/html;charset=utf-8"); $client=newSoapClient(" http://192.168.3.178:8080/ChkWelePsw.asmx?WSDL"); //本行测试不可行 $client = new SoapClient(" http://192.168.3.178:8080/chkwelepsw.asmx?WSDL/ChkWele?username=test3&psw=123"); //参数这样传递 先包装一下 $param=array('username'=>'test3','psw'=>'123'); //调用必须用__soapCall $p=$client->__soapCall('ChkWele',array('parameters'=>$param)); print_r($p->ChkWeleResult);//这里先输出一下变量$p,看看是什么类型。 ?> |
注意,在php调用某个方法后,其soap对象,就会自动产生一个Result方法,以方便显示调用结果,如上面的 被调用端的WebService的 “ChkWele”方法 ,
调用端就有相应的“ChkWeleResult”方法。
.NET部分 webservice要注意的地方
代码如下 | 复制代码 |
/* * <system.web>在这个节点中加入如下内容 <webServices> <protocols> <add name="HttpSoap"/> <add name="HttpPost"/> <add name="HttpGet"/> <add name="Documentation"/> </protocols> </webServices> */ [WebMethod(Description ="This......", EnableSession =false)] publicstringChkWele(stringusername,stringpsw) { stringret =""; returnret; } |
本文介绍了PHP 中使用ajax时一些常见错误总结整理,非常实用,有兴趣的同学可以看看
PHP作为后端时,前端js使用ajax技术进行相互信息传送时,经常会出错误,对于新手来说有些手足无措。总结错误、经验,以后随时回顾。
第一个问题,当前端无错误的情况下,页面调试也显示没有问题,但是ajax获取不到后端php文件发送过来的信息:
前端代码如下:
代码如下 | 复制代码 |
$.ajax({ url:Ƈ.php',//目的php文件 data:{"age":12,"name":'zh'},//传送的数据 type:‘post',//方式post/get dataType:'json',//数据传送格式 success:function(response) { console.log(response); }, error:function(response) { console.log(response); console.log("错误"); } }); |
php后端代码如下:
代码如下 | 复制代码 |
$postAge=$_POST['age']; $postName=$_POST['name']; echo$postAge; echo$postName; |
页面出现后,F12调试查看如下所示:
状态码都没问题,status是200,responseReady是4,说明在html发送给php文件信息过程是没有问题的。而且php也返回了信息。可是为什么程序走了error而没有走success呢?
这时需要小心!由于php后端多个echo没有把数据整理为json格式。也就是说php返回的是一个字符串不是json格式的数据。有人说加上json_encode()呢?这样也是不行的,因为json_encode()的函数作用没搞清,百度仔细看下。json_encode()与json_decode()是一对。
json_encode(json),把json整理为json格式的数据。在上例中,就算php后端代码改写为:echo json_encode(postAge);和echojsonencode(postName);也是不对的。因为这样仅仅是把单个postAge和postName整理为了json格式,但是由于是2个返回,既是2个response,在浏览器调试页面也可以看到1个post回来2个response。这样导致2个json格式的数据返回给前端是就不再是json格式的数据(我理解为json污染,方便理解)。也就是单个数据是json格式但是多个json格式数据“胡乱”结合在一起不按照json格式合并在一起就会产生“污染”。导致整体数据格式混乱无法被识别,这种情况者数据处理和传输时随时都见得到。
json_decode(json,true/false)函数是把json整理为数组或者object(理解为类)。true是强制装换为(关联)数组,false是默认的会转换为object形式的数据。
回到本文提出的例子上。
既然传送回来的数据不再是json格式的数据,那么就是dataType的问题了。
dataType是告诉浏览器检查传送的数据格式。如果不写,浏览器不会去检查数据格式,写了就一定检查而且必须满足格式要求。本例中,由于写了为json格式,但是传回来时不是json格式,所以浏览器认为传输过程中出现了错误,所以走了error而没有走success。
这时最好的方式是修改php代码,将echo的内容改为一个数组,用数组的信形式把整体数据整理为json格式进行传送(json_encode),避免发生错误。
当然也可以使用另一种方法,类似作弊的方法,直接注释掉(或者不写)dataType,这样浏览器就不会去检查数据的形式而是根据数据的形式智能的判断,类似蒙混过关。
以下是dataType的W3school解释:
值得注意的是,后端php文件中多个echo输出后,数据返回确是一起返回的,既是修改正确后,前端得到的数据是2个数据合为一个字符串的形式数据。本例子中得到的数据是12zh。
当然还有很多细节问题了,比如php后端只能用echo或者die(),不能用return,这是因为return是只在服务器端中返回数据使用,而echo是打印数据,将数据从服务器端打印出来,给前端。return只能在服务器端,或者前端单一的返回。而die()的强大就不提了,直接终止后端php程序的形式返回数据。
还有比如在$,ajax({});中每一行既是一个参数,参数之间是逗号隔开,多个数据是在{}内,隔开是用逗号等等。
小编给大家推荐的这篇文章介绍了浅谈PHP的反射API的教程,非常实用,有兴趣的同学快来看看吧PHP的反射API,即在PHP运行状态下,通过分析PHP程序,可以导出对象所属的类,方法,属性,参数等信息。
如何使用反射API
示例代码 Person.php
Person类,包含一个成员变量和三个成员方法
获取$student对象的方法和属性列表
ReflectionClass类报告了一个类的有关信息
输出结果为:name say __set __get
也可以用class函数,获取对象属性的关联数组的信息
通过class()函数获取类的信息
打印结果:
通过这个反射API,可以做hook实现插件功能,动态代理等。
网上找的动态代理示例
相关文章
- 这篇文章主要介绍了cmd下过滤文件名称的两种方法,需要的朋友可以参考下...2020-06-30
- 多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分。而如何批量修改已有数据库的前缀名呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍的是相对简单的...2015-10-21
使用GetInvalidFileNameChars生成文件名
这篇文章主要介绍了一个很实用的函数Path.GetInvalidFileNameChars(),他可以很方便的生成一个有效的文件名称...2020-06-25- 这篇文章主要介绍了C#编程实现获取文件夹中所有文件的文件名,可实现获取特定目录下制定类型文件名称的功能,涉及C#针对文件与目录的遍历、查询等操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#中文件名或文件路径非法字符判断方法,本文主要使用了内置的GetInvalidFileNameChars方法实现非法字符判断,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了js获取url页面id,也就是最后的数字文件名,有时候我们需要判断当前页面的id,又不用重新生成页面直接用js获取最后的数字.htm即可...2020-09-25
- 这篇文章主要介绍了Python通过fnmatch模块实现文件名匹配,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-01
- 下面我来总结一下php utf8编码上传中文文件名出现乱码解决办法,有碰这类问题的朋友可参考参考。 代码如下 复制代码 <?php if(isset($_FIL...2016-11-25
- 这篇文章主要介绍了PHP获取当前执行php文件名的代码,需要的朋友可以参考下...2017-03-12
- 在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符,那么具体是包括哪些符号不能作为文件名呢?下面小编给大家介绍下...2020-06-25
- 可能会有不少朋友碰到一些问题就是上传文件时如果是英文倒好原文名不会有问题,如果是中文可能就会出现乱码了,今天我来给大家总结一下导致乱码php上传文件中文文件名乱...2016-11-25
- 使用fck的朋友可能会碰这样一个情况就是如果上你的文件名为英文字母是没有任何问题,如果上传的是中文汉字就会出现中文名乱码了,下面我来给大家分析与介绍解决方法。...2016-11-25
- fopen函数是用来创建或访问文件的但如果是中文处理就不是那么了经常会碰到中文出错问题了,对于这个问题我们来看看处理办法。 PHP使用fopen()、filesize()等PHP...2016-11-25
- 提供二款利用遍历批量修改文件的文件名的php代码,有需要的朋友可以参考一下。 实例一 代码如下 复制代码 <?php //利用PHP目录和文件函数遍...2016-11-25
在FireFox/IE下Response中文文件名乱码问题解决方案
只是针对没有空格和IE的情况下使用Response.AppendHeader()如果想在FireFox下输出没有编码的文件,并且IE下输出的文件名中空格不为+号,就要多一次判断了,接下来将详细介绍下感兴趣的朋友可以了解下,或许对你有所帮助...2021-09-22- 这篇文章主要介绍了C#中的文件路径获取函数和文件名字获取函数小结,本文讲解了获取绝对文件路径、获取文件名字、获得包含 path 目录信等内容,需要的朋友可以参考下...2020-06-25
- 帝国CMS6.6/7.0都有效。第一步:找到:/e/class/connect.php查找:$r[filetype]=GetFiletype($file_name);在下面加入:$filename2=str_replace($r[filetype], '', $file_na...2015-12-30
- 今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说批量修改图片大小的方法,各位想知道具体方法的使用者们,那么各位就快来跟着小编一起看看方法吧。 ...2016-09-14
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说说批量修改文件名的经验技巧,各位想知道的使用者,那么下面就快来跟着小编一起看一看吧。 给各位photosh...2016-09-14
- 在php文件上传时我们需要获取文件名后缀之后进行简单文件类型判断了,而在php中文件名后缀获取方法很简单并且有很多种,下面我来总结一下。 1.basename()-返回路径的...2016-11-25