当前位置:  编程技术>php
本页文章导读:
    ▪php中escape函数的实现方法详解      采用js对URL中的汉字进行escape编码。 <a href="" onclick="window.open('product_list.php?p_sort='+escape(''));">,点击链接后的效果类似这样:http://127.0.0.1/shop/product_list.php?p_sort=%u5F00%u53D1%u8D44%u6E90%u7F51 可.........
    ▪实例解析PHP中empty,is_null和isset的用法区别      以下对比分析php中empty,is_null和isset()的区别,代码如下: <?php $a; $b = false; $c = ''; $d = 0; $e = null; $f = array(); //by www. ?> 下面来看三者的不同输出吧。 1,empty的var_dump输出:   boolean t.........
    ▪php中DIRECTORY_SEPARATOR,PATH_SEPARATOR常量的作用      php常量1,DIRECTORY_SEPARATOR DIRECTORY_SEPARATOR:路径分隔符,linux上就是‘/’    windows上是‘\’ php常量2,PATH_SEPARATOR PATH_SEPARATOR:include多个路径使用,在windows下,当需要include多个路径时,要用.........

[1]php中escape函数的实现方法详解
    来源: 互联网  发布时间: 2013-12-24

采用js对URL中的汉字进行escape编码。
<a href="" onclick="window.open('product_list.php?p_sort='+escape(''));">,点击链接后的效果类似这样:http://127.0.0.1/shop/product_list.php?p_sort=%u5F00%u53D1%u8D44%u6E90%u7F51
可见PHP的urldecode()或者base64_decode()是无法反解的。

可以考虑用php实现一个反解函数,如下:
 

代码示例:
<?php
function js_unescape($str){
$ret = '';
$len = strlen($str);
for ($i = 0; $i < $len; $i++)
{
if ($str[$i] == '%' && $str[$i+1] == 'u')
{
$val = hexdec(substr($str, $i+2, 4));
if ($val < 0x7f) $ret .= chr($val);
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f)); else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));
$i += 5;
}
else if ($str[$i] == '%')
{
$ret .= urldecode(substr($str, $i, 3));
$i += 2;
}
else $ret .= $str[$i];
}
return $ret;}
?>

注意JS编码会自动转换成为UTF-8, 所以必须进行编码转换才能得到正确的结果,否则会中文乱码。但如果使用UTF-8编码就不用这一步了。
代码如下:print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort']));
到此我们就成功地反解了js的escape编码了。
如下:
用PHP实现js的escape编码的函数:
 

代码示例:
<?php
function phpescape($str)
{
$sublen=strlen($str);
$retrunString="";
for ($i=0;$i<$sublen;$i++)
{
if(ord($str[$i])>=127)
{
$tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));
//$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);window下可能要打开此项
$retrunString.="%u".$tmpString;
$i++;
} else
{
$retrunString.="%".dechex(ord($str[$i]));
}
}
return $retrunString;
}
?>

在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传 送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑到js中有unescape函数,故若在php中有个escape函数,对数据 进行编码,在客户端用unescape进行 解码,这样就会方便很多。
很多用php实现的escape函数,基本类似,这里举个例子:
 

代码示例:
<?php
function phpEscape($str) {
preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(ord($v[0]) < 128)
$ar[$k] = rawurlencode($v);
else
$ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
}
return join("",$ar);
}
?>
 

解释一下这个函数的原理。
第一句:preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);这个是用正则表达式匹配 字符串中所有的字符,[\x80-\xff]. 匹配的是汉字,\x表示匹配字符的16进制编码,[ ] 是类选择符,“.” 表示任意一个字符,这样[\x80-\xff].匹配的是两个字符,其中第一个就是16进制从80到ff的字符,而这恰好就是汉字编码的第一个字符。这样 就能完整的匹配一个汉字。关于unicode中汉字的编码,大家可以到网上搜索一下。
同理,[\x01-\x7f]+英文字符串,因为最早的英文是 ASCII编码,编码值小于128,也就是16进制的从01到7f,"+"表示一个或者多个字符,这样[\x01-\x7f]+就能匹配连续多个英文字符 串。
示例:
 

代码示例:
<?php
$ar = $r[0]; //$r[0]里存放是匹配到的数组
foreach($ar as $k=>$v) {
if(ord($v[0]) < 128) //假如字符编码值小于128,说明是个英文字符
$ar[$k] = rawurlencode($v); //直接用rawurlencode编码
else
$ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v)); //否则的话用iconv函数把汉字转变成ucs-2编码,也就是unicode编码
}
?>
 

在javascript中就可以用unescape来解码了。
\u0391-\uFFE5 和\u4e00-\u9fa5来匹配中文。
但好像前者包含汉字下的A-¥等 后者可能是纯汉字。
其中解码函数为:
 

代码示例:
<?php
function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/%u.{4}|&#x.{4};|&#\d+;|.+/U",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u")
$ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,-4)));
elseif(substr($v,0,3) == "&#x")
$ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,3,-1)));
elseif(substr($v,0,2) == "&#") {
$ar[$k] = iconv("UCS-2","GBK",pack("n",substr($v,2,-1)));
}
}
return join("",$ar);
}
?>

一、编码范围
1,GBK (GB2312/GB18030)
 

\x00-\xff GBK双字节编码范围
\x20-\x7f ASCII
\xa1-\xff 中文
\x80-\xff 中文

2,UTF-8 (Unicode)
 

\u4e00-\u9fa5 (中文)
\x3130-\x318F (韩文
\xAC00-\xD7A3 (韩文)
\u0800-\u4e00 (日文)
 

备注:韩文是大于[\u9fa5]的字符

正则例子:
 

代码示例:
preg_replace("/([\x80-\xff])/","",$str);
preg_replace("/([u4e00-u9fa5])/","",$str);

    
[2]实例解析PHP中empty,is_null和isset的用法区别
    来源: 互联网  发布时间: 2013-12-24

以下对比分析php中empty,is_null和isset()的区别,代码如下:

<?php
$a;
$b = false;
$c = '';
$d = 0;
$e = null;
$f = array(); 
//by www.
?>

下面来看三者的不同输出吧。

1,empty的var_dump输出:
 

boolean true
boolean true
boolean true
boolean true
boolean true
boolean true

2,is_null的输出:
 

boolean true
boolean false
boolean false
boolean false
boolean true
boolean false

3,isset的输出:
 

boolean false
boolean true
boolean true
boolean true
boolean false
boolean true

对比分析结果:
empty() 可以用来判定所有的数据类型是否为空或假,而 is_null 与 isset 基本一样,只能用来判断是否为NULL和未定义。
亲,你明白了吗?,祝大家学习进步。


    
[3]php中DIRECTORY_SEPARATOR,PATH_SEPARATOR常量的作用
    来源: 互联网  发布时间: 2013-12-24

php常量1,DIRECTORY_SEPARATOR
DIRECTORY_SEPARATOR:路径分隔符,linux上就是‘/’    windows上是‘\’

php常量2,PATH_SEPARATOR
PATH_SEPARATOR:include多个路径使用,在windows下,当需要include多个路径时,要用”;”隔开。
在linux下使用”:”隔开。

说明:这2个常量的使用,可以避免不同平台的兼容性问题。

例如,在zend framework框架中,include 设置 index.php

<?php
set_include_path('.' . PATH_SEPARATOR . '../library/' . PATH_SEPARATOR . './application/models/'
. PATH_SEPARATOR . './application/lib/'
. PATH_SEPARATOR . get_include_path());
?>

get_include_path取得当前已有的环境变量,加上前面的设置便是新的系统include。

通过这个例子,可以理解PATH_SEPARATOR的用法。

再来看,DIRECTORY_SEPARATOR。
php的内部常量,用于显示系统分隔符的命令,不需要任何定义与包含即可直接使用。

在windows下路径分隔符是/(当然/在部分系统上也是可以正常运行的),在linux上路径的分隔符是\。
这样在跨平台部署程序时,会有问题。
比如开发机器是windows,有一个图片上传程序,调试机器上指定的上传文件保存目录是:

define(ROOT, dirname(__FILE__)."/upload");

在本地调试都很正常,但是上传到linux服务器以后,发现会出错。

此时,就需要DIRECTORY_SEPARATOR常量上场了,可以这样:

define(ROOT, dirname(__FILE__).DIRECTORY_SEPARATOR."upload");

DIRECTORY_SEPARATOR是一个返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回\,而在linux或者类unix上返回/。
通常在定义包含文件路径或上传保存目录时用到。

例如:

<?php
const DIR_SEP = DIRECTORY_SEPARATOR;// 路径分割 win下\ linux下/  
private function __construct()  
{  
$this->_options = array(  
template_dir => templates . self::DIR_SEP, //模板文件所在目录  
cache_dir => templates . self::DIR_SEP . cache . self::DIR_SEP, //缓存文件存放目录  
auto_update => false, //当模板文件改动时是否重新生成缓存  
cache_lifetime => 0, //缓存生命周期(分钟),为 0 表示永久  
suffix => .html //模板文件后缀  
);  
}
?>

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
数据库其它 iis7站长之家
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3