我需要函数来编码和解码树节点的所有id.
我的函数将检查它是单个字符串或数组字符串还是带分隔符的字符串.
我有一个用于编码和解码的插件.
这是我的插件:
文件:encode.class.php
<?php
/*-------------------------
Author: Jonathan Pulice
Date: July 26th, 2005
Name: JPEncodeClass v1
Desc: Encoder and decoder using patterns.
-------------------------*/
class Protector
{
var $Pattern = "";
var $PatternFlip = "";
var $ToEncode = "";
var $ToDecode = "";
var $Decoded = "";
var $Encoded = "";
var $Bug = false;
var $DecodePattern = "";
function Debug($on = true)
{
$this->Bug = $on;
}
function Encode()
{
$ar = explode(":", $this->Pattern);
$enc = $this->ToEncode;
if ($this->Bug) echo "<!-- BEGIN ENCODING -->\n";
foreach ($ar as $num => $ltr)
{
switch ($ltr)
{
case "E":
$enc = base64_encode($enc);
break;
case "D":
$enc = base64_decode($enc);
break;
case "R":
$enc = strrev($enc);
break;
case "I":
$enc = $this->InvertCase($enc);
break;
}
if ($this->Bug) echo "<!-- {$ltr}: {$enc} -->\n";
}
if ($this->Bug) echo "<!-------------------->\n\n";
@$this->Encoded = ($enc == $this->Str) ? "<font color='red'>No Encoding/Decoding Pattern Detected!</font>" : $enc;
return $this->Encoded;
}
function Decode()
{
$pattern = ($this->DecodePattern != "") ? $this->DecodePattern : $this->Pattern;
//Reverse the pattern
$this->PatternFlip($pattern);
//make into an array
$ar = explode(":", $this->PatternFlip);
$t = ($this->Encoded == "") ? $this->ToDecode : $this->Encoded;
if ($this->Bug) echo "<!-- BEGIN DECODING -->\n";
foreach ($ar as $num => $ltr)
{
switch ($ltr)
{
case "E":
$t = base64_encode($t);
break;
case "D":
$t = base64_decode($t);
break;
case "R":
$t = strrev($t);
break;
case "I":
$t = $this->InvertCase($t);
break;
}
if ($this->Bug) echo "<!-- {$ltr}: {$t} -->\n";
}
if ($this->Bug) echo "<!-------------------->\n\n";
$this->Decoded = ($t == $this->Encoded) ? "<font color='red'>No Encoding/Decoding Pattern Detected!</font>" : $t;
return $this->Decoded;
}
function MakePattern($len = 10)
{
//possible letters
// E - Base64 Encode
// R - Reverse String
// I - Inverse Case
$poss = array('E','R', 'I');
//generate a string
for ( $i = 0 ; $i < $len ; $i++ )
{
$tmp[] = $poss[ rand(0,2) ];
}
//echo $str. "<br>";
//fix useless pattern section RR II
$str = implode(":", $tmp);
//fix
$str = str_replace( 'R:R:R:R:R:R' , 'R:E:R:E:R:E' , $str );
$str = str_replace( 'R:R:R:R:R' , 'R:E:R:E:R' , $str );
$str = str_replace( 'R:R:R:R' , 'R:E:R:E' , $str );
$str = str_replace( 'R:R:R' , 'R:E:R' , $str );
$str = str_replace( 'R:R' , 'R:E' , $str );
//fix
$str = str_replace( 'I:I:I:I:I:I' , 'I:E:I:E:I:E' , $str );
$str = str_replace( 'I:I:I:I:I' , 'I:E:I:E:I' , $str );
$str = str_replace( 'I:I:I:I' , 'I:E:I:E' , $str );
$str = str_replace( 'I:I:I' , 'I:E:I' , $str );
$str = str_replace( 'I:I' , 'I:E' , $str );
//string is good, set as pattern
$this->Pattern = $str;
return $this->Pattern; //if we need it
}
function PatternFlip($pattern)
{
//reverse the pattern
$str = strrev($pattern);
$ar = explode(":", $str);
foreach ($ar as $num => $ltr)
{
switch ($ltr)
{
case "E":
$tmp[] = "D";
break;
case "D":
$tmp[] = "E";
break;
case "R":
$tmp[] = "R";
break;
case "I":
$tmp[] = "I";
break;
}
}
$rev = implode(":", $tmp);
$this->PatternFlip = $rev;
return $this->PatternFlip;
}
// This is my custom Case Invertor!
// if you would like to use this in a script, please credit it to me, thank you
function InvertCase($str)
{
//Do initial conversion
$new = strtoupper( $str );
//spluit into arrays
$s = str_split( $str );
$n = str_split( $new );
//now we step through each letter, and if its the same as before, we swap it out
for ($i = 0; $i < count($s); $i++)
{
if ( $s[$i] === $n[$i] ) //SWAP THE LETTER
{
//ge the letter
$num = ord( $n[$i] );
//see if the ord is in the alpha ranges ( 65 - 90 | 97 - 122 )
if ( ( $num >= 65 AND $num <= 90 ) OR ( $num >= 97 AND $num <= 122 ) )
{
if ($num < 97 ) { $num = $num + 32; }
else { $num = $num - 32; }
$newchr = chr($num);
$n[$i] = $newchr;
}
}
}
//join the new string back together
$newstr = implode("", $n);
return $newstr;
}
}
?>
通过使用此插件中的函数,我必须编写一个函数来检查不同的条件.
解决方法:
我从这个基类为你写了一个扩展类的原型.不确定$PatternFlip是什么,它在这个类中是不可访问的,所以你必须根据需要改变它.如果您希望结果采用不同的格式,则可以向该类添加函数.
class MyProtector extends Protector {
var $Object;
var $encode;//1 means encode, not 1 means decode
var $result;
function __MyProtector($obj="",$encode=0,$pattern="") {
$this->$Object=$obj;
if($encode){//encode object
$this->$EncodePattern=$pattern;
$this->$result=smartEncode($obj);
}else{//decode object
$this->$DecodePattern=$pattern;
$this->result=smartDecode($obj);
}
}
private function smartEncode($object){
//encodes string or array
if(is_array($object){
return encodeArray($object);
}else if(is_string($object)){
return encodeString($object);
}
return 0;
}
private function smartDecode($object){
//encodes string or array
if(is_string($object)&&strpos("&",$object)===1){
return encodeDelimiter($object);
}else if(is_string($object)){
return encodeString($object);
}
return 0;
}
private function decodeDelimiter($object){
$a=explode("&",$string);//will only work if your encoding does not include "&"!
$aDecoded=array();
$k=0;
foreach($a as $i){
$this->toDecode=$i;
$aDecoded[$k]=$this->Decode();
$k++;
}
return $aDecoded;
}
private function decodeString($s){
$this->toDecode=$s;
return $this->Decode();
}
private function encodeString($s){
$this->toEncode=$s;
return $this->Encode();
}
private function encodeArray($s){
foreach($s as $i){
$this->toEncode=$i;
$s=$s.$this->Encode()."&";
}
return $s;
}
//setters and getters
function getPattern(){
return $this->Pattern;
}
function getPatternFlip(){
return $this->Pattern;
}
function getPattern(){
return $this->Pattern;
}
//..etc
用法示例:
$o=new MyProtector($string,0,$pattern);
echo $o->$result; //returns encoded string
$o=new MyProtector($string,1,$pattern);
echo $o->$result; //returns decoded string
$o=new MyProtector($array,0,$pattern);
echo $o->$result; //returns decoded string with '&' inbetween encoded array entries
$o=new MyProtector($stringWithDelimiter,1,$pattern);
echo $o->$result;//returns decoded array
我确定会有一些语法错误,错误在那里,因为我没有编译/尝试过的东西.希望有所帮助.