_pegPositions)); } public function setRingOffset ($offset) { if(preg_match('/^[A-Z]$/',$offset)) { $offset=$this->_charToAlphabetPosition($offset); } else if(!is_integer($offset) || ($offset<1) || ($offset>26)) { throw new Exception("Offset must be integer in range 1..26"); } $this->_ringOffset = $offset; } public function getRingOffset () { return $this->_ringOffset; } public function getCoreMapping () { return $this->_coreMapping; } public function getOutputCharacterForInputCharacter ($inputCharacter) { $inputCharacter = strtoupper($inputCharacter); $coreInputCharacter = $this->_getCharacterOffsetBy( $inputCharacter, $this->_ringOffset-1 ); $coreOutputCharacter = $this->_coreMapping[$coreInputCharacter]; $outputCharacter = $this->_getCharacterOffsetBy( $coreOutputCharacter, 0 - ($this->_ringOffset-1) ); // $outputCharacter= $this->_coreMapping[$inputCharacter]; return ($outputCharacter); } public function getOutputCharacterForInputCharacterReverse ($inputCharacter) { $inputCharacter = strtoupper($inputCharacter); $coreInputCharacter = $this->_getCharacterOffsetBy($inputCharacter, $this->_ringOffset - 1); $flipMap=array_flip($this->_coreMapping); $coreOutputCharacter = $flipMap[$coreInputCharacter]; $outputCharacter = $this->_getCharacterOffsetBy( $coreOutputCharacter, 0 - ($this->_ringOffset -1) ); return ($outputCharacter); } private function _getCharacterOffsetBy ($character, $offset) { $charAsInt = $this->_charToAlphabetPosition($character); $newInteger = (26 + $charAsInt - $offset) % 26; if($newInteger==0) { $newInteger=26; } $newCharacter = $this-> _alphabetPositionToCharacter($newInteger); return ($newCharacter); } private function _charToAlphabetPosition ($char) { if(!preg_match('/^[A-Z]$/',$char)) { throw new Exception ("Bad Character '$char'"); } $position= (ord($char)-64); return $position; } private function _alphabetPositionToCharacter ($position) { if(($position<1) || ($position>26)){ throw new Exception ("Bad alphaoffset '$position'"); } $char= (chr($position+64)); return $char; } }