Intereting Posts
Пользовательский php.ini при выполнении php в качестве сценария оболочки Laravel Pagination с хорошими URL-адресами, чем строка запроса gzzle ver 6 post method не является woking Разбиение ключа массива и просмотр, если он содержит значение Невозможно использовать строковое смещение в виде массива в php Внедрить класс Mark Markdown в WordPress Theme – класс Markdown не найден C #: проблема с командами оболочки Действие триггера, когда загрузка файла фактически завершается Как я могу получить данные Google Analytics? преобразовать дату php в формат mysql php curl: как я могу эмулировать запрос получения точно так же, как веб-браузер? Laravel – нетерпеливая загрузка метода (а не отношения) модели Eloquent Попытка создания URL-адресов с регулярным выражением PHP, японские символы не проходят php crawl – включен javascript определять пользовательские переменные и прямое обращение к переменным в виде части

PHP-массив Кодирование и декодирование: нужна функция для кодирования и декодирования строки или массива с разделителями или массивом

Мне нужна функция, которая будет кодировать и декодировать все идентификаторы узлов дерева. Я использую функцию, которая проверяет, есть ли одна строка или строка массива или строка с разделителями. У меня есть один плагин для кодирования и декодирования. здесь идет мой плагин:

FIle: 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 

Я уверен, что там будет несколько синтаксических ошибок, опечаток, поскольку я не компилировал / не пробовал вещь. Надеюсь, что это помогло.