发布一个jQuery插件 PHP的serialize 和 unserialize

wj008 2009-12-08 09:21:02

jQuery.extend({objTostr:function(obj){
function __typeof(objClass){if(objClass&&objClass.constructor){var strFun = objClass.constructor.toString();var className =strFun.substr(0, strFun.indexOf('('));className = className.replace('function', '');return className.replace(/(^\s*)|(\s*$)/ig, '');}return typeof(objClass);}
function OutJsObject(Arr,Tab){
var Rstr=new Array();Tab+=" ";
for (var i in Arr){
//if(typeof(Arr[i])=="function")continue;
var Item=Tab+" ["+i+"]=>"+OutJsVal(Arr[i],Tab);
Rstr.push(Item);
}
return{Rstr:Rstr.join("\n"),Tab:Tab};}
function OutJsVal(Obj,Tab)
{
var Typ=typeof(Obj);
if(Obj==null)return null;
if(Typ=="function"){return "[function]";}
if(Typ=="number"||Typ=="boolean"||Typ=="string"){return Obj;}
if(Typ=="object"){
if(Obj instanceof Number||Obj instanceof Boolean||Obj instanceof String){return Obj.toString();}
else if(Obj instanceof Array){var Sd= OutJsObject(Obj,Tab);var Tb=Sd.Tab;return "Array\n"+Tb+"(\n"+Sd.Rstr+"\n"+Tb+")";}
else if(Obj.toString()!="[object Object]")
{
return Obj.toString();
}
else{var Tname=__typeof(Obj);var Sd= OutJsObject(Obj,Tab);var Tb=Sd.Tab;return Tname+" Object\n"+Tb+"(\n"+Sd.Rstr+"\n"+Tb+")";}
}
return "";
}
var Str=OutJsVal(obj,"");
return Str; },trace:function(obj){alert(this.objTostr(obj));}});
jQuery.fn.extend({trace:function(obj){this.html("<pre>"+$.objTostr(obj)+"</pre>");}});
jQuery.extend((function()
{
// 设置PHP文件编码---------
var PHP_Ecoding="utf-8";
//-------------------
//获得编码的字节长度
var getCharLength=function(str){
if(PHP_Ecoding.toLowerCase()=="utf-8")
return str.replace(/[^\x00-\xff]/g,"***").length;
else
return str.replace(/[^\x00-\xff]/g,"**").length;
}
//计算对象长度 不包括function
var CountObject=function(Obj){var l=0;for (var i in Obj){if(php_typeof(Obj[i])=="N"&&Obj[i]!=null)continue;l++;}return l;}
//返回对象带名称类型
var __typeof=function(objClass)
{
if (objClass&&objClass.constructor)
{
var strFun = objClass.constructor.toString();
var className =strFun.substr(0, strFun.indexOf('('));
className = className.replace('function', '');
return className.replace(/(^\s*)|(\s*$)/ig, '');
}
return typeof(objClass);
}
//返回对应PHP的类型
var php_typeof =function(Obj)
{
switch(typeof(Obj))
{
case "number": return /^-?\d+$/.test(Obj)?"i":"d";break;
case "string": return "s";break;
case "boolean":return "b";break;
case "object":
{
if(Obj==null) return "N";
if(Obj instanceof Array)return "a";
if(Obj.toString()=="[object Object]")return "O";
else return "N";
break;
}
default :return "N";break;
}
}
//获得值的PHP代码-----------------
var php_getValCode=function(Obj)
{
if(typeof(Obj)=="function")return "";
var Typ=php_typeof(Obj);
if(Typ=="i"||Typ=="d"){return Typ+":"+Obj+";"}
else if(Typ=="b"){return Typ+":"+(Obj==true?1:0)+";"}
else if(Typ=="s"){return "s:"+getCharLength(Obj)+":\""+Obj+"\";"}
else if(Typ=="a"){return "a:"+CountObject(Obj)+":"+"{"+php_getObjCode(Obj)+"}";}
else if(Typ=="O"){
var Tname=__typeof(Obj);
if(Tname=="Object")Tname="stdClass";
return Typ+":"+Tname.length+":\""+Tname+"\":"+CountObject(Obj)+":{"+php_getObjCode(Obj)+"}";
}
else {return "N;";}
return "";
}
//获得对象的PHP代码-----------------
var php_getObjCode=function(Obj)
{
var Rstr="";
for (var i in Obj)
{
var Item="";
i=/^\d+$/.test(i)?Number(i):i;
var Str=Obj[i];
if(php_typeof(Str)=="N"&&Str!=null)continue;
var KeyTyp=php_typeof(i);
if(KeyTyp=="i"){Item=KeyTyp+":"+i+";";}
else if(KeyTyp=="s"){Item=KeyTyp+":"+getCharLength(i)+":\""+i+"\";";}
else {continue;}
Item+=php_getValCode(Str);
Rstr+=Item;
}
return Rstr;
}
//解析PHP对象==================
var exposition_php=function(Str)
{
var key;
var val;
key=Str.substr(0,1);
if(key=="N"){
val=null;
var Idx=Str.indexOf(";",0);
Str=Str.substring(Idx+1);
}
if(key=="i"||key=="d"){
var Idx=Str.indexOf(";",2);
if(Idx===false)return null;
val=Number(Str.substring(2,Idx));
Str=Str.substring(Idx+1);
}
if(key=="b"){
var Idx=Str.indexOf(";",2);
if(Idx===false)return null;
val=Number(Str.substring(2,Idx))==0?false:true;
Str=Str.substring(Idx+1);
}
if(key=="s"){
var Idx=Str.indexOf(":",2);
if(Idx===false)return null;
var Len=Number(Str.substring(2,Idx));
Idx=Str.indexOf("\"",Idx);
if(Idx===false)return null;
val=Str.substr(Idx+1,Len);
//------------------------
var nLen=Len;
var char_Len=getCharLength(val);
var Dec =parseInt(Len/2);
//使用增量快速查找-------
while(char_Len!=Len){
if(char_Len>Len){nLen-=Dec;}else{nLen+=Dec;}
val=Str.substr(Idx+1,nLen);
char_Len=getCharLength(val);
Dec =parseInt(Dec/2);
if(Dec==0)Dec=1;
}
Len=nLen;
//-------------------------
Str=Str.substring(Idx+Len+3);
}
if(key=="a"){
val=new Array();
var Idx=Str.indexOf(":",2);
if(Idx===false)return null;
var Len=Number(Str.substring(2,Idx));
Idx=Str.indexOf("{",Idx);
if(Idx===false)return null;
Str=Str.substring(Idx+1);
for(var i=0;i<Len;i++)
{
var MKeyobj=exposition_php(Str);
if(MKeyobj==null)return null;
Str=MKeyobj.str;
var Mvalobj=exposition_php(Str);
if(Mvalobj==null)return null;
Str=Mvalobj.str;
val[MKeyobj.val]=Mvalobj.val;
}
Idx=Str.indexOf("}");
if(Idx===false)return null;
Str=Str.substring(Idx+1);
}
if(key=="O"){
var Idx=Str.indexOf(":",2);
if(Idx===false)return null;
var sLen=Number(Str.substring(2,Idx));
Idx=Str.indexOf("\"",Idx);
if(Idx===false)return null;
var Fval=Str.substr(Idx+1,sLen);
if(Fval=="stdClass")Fval="Object";
eval("val=new "+Fval+"();");
Idx=Idx+sLen+3;
var Edx=Str.indexOf(":",Idx);
if(Edx===false)return null;
var Len=Number(Str.substring(Idx,Edx));
Idx=Str.indexOf("{",Edx);
if(Edx===false)return null;
Str=Str.substring(Idx+1);
if(Idx===false)return null;
for(var i=0;i<Len;i++)
{
var MKeyobj=exposition_php(Str);
if(MKeyobj==null)return null;
Str=MKeyobj.str;
var Mvalobj=exposition_php(Str);
if(Mvalobj==null)return null;
Str=Mvalobj.str;
val[MKeyobj.val]=Mvalobj.val;
}
Idx=Str.indexOf("}");
if(Idx===false)return null;
Str=Str.substring(Idx+1);
}

return {val:val,str:Str};
}


var _serialize=function(Obj,Ecoding)
{
PHP_Ecoding=Ecoding||PHP_Ecoding;
return php_getValCode(Obj);
}
var _unserialize=function(Str,Ecoding)
{
PHP_Ecoding=Ecoding||PHP_Ecoding;
var Obj=exposition_php(Str);
if(Obj!=null)
return Obj.val;
else
return null;
}
return {php_serialize:_serialize,php_unserialize:_unserialize}
})());

...全文
517 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj008 2009-12-08
  • 打赏
  • 举报
回复
看 可否改良!
sohighthesky 2009-12-08
  • 打赏
  • 举报
回复
sf么?

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧