resubmitting updated function in re:#76975
<?php
function asc_shift($str,$offset=0) {
$new = '';
for ($i = 0; $i < strlen($str); $i++)
$new .= chr(ord($str[$i])+$offset);
return $new;
}
?>
because as of PHP 6, $str{$i} is deprecated.
str_rot13
(PHP 4 >= 4.2.0, PHP 5)
str_rot13 — Perform the rot13 transform on a string
Description
string str_rot13 ( string $str )This function performs the ROT13 encoding on the str argument and returns the resulting string. The ROT13 encoding simply shifts every letter by 13 places in the alphabet while leaving non-alpha characters untouched. Encoding and decoding are done by the same function, passing an encoded string as argument will return the original version.
Poznámka: The behaviour of this function was buggy until PHP 4.3.0. Before this, the str was also modified, as if passed by reference.
str_rot13
grawity+phpnet at gmail dot com
31-Dec-2007 02:39
31-Dec-2007 02:39
nick at lazy-river dot net
08-Aug-2007 06:01
08-Aug-2007 06:01
This is recursive function to shift the component letters of a string left or right in the ascii table.
I've left it simple as it suits my needs, but you may want to include error checking for a null string and also put bounds in place, or make it actually rotate around the whole character set rather than just shifting the string up or down.
function asc_shift($string, $amount) {
$key = substr($string, 0, 1);
if(strlen($string)==1) {
return chr(ord($key) + $amount);
} else {
return chr(ord($key) + $amount) . asc_shift(substr($string, 1, strlen($string)-1), $amount);
}
}
For example:
<?php
echo asc_shift("TESTING12345@", 5);
?>
shifts every character up 5 ascii positions, resulting in this string:
YJXYNSL6789:E
In reverse:
<?php
echo asc_shift("YJXYNSL6789:E", -5);
?>
shifts every character down 5 ascii positions, resulting in this string:
TESTING12345@
arwab at surrealwebs dot com
11-Jul-2007 10:11
11-Jul-2007 10:11
here's my rot function, it works anyway
<?php
/**
* preforms the rotation algorithm on the passed in string
*/
function _rot( $str , $dist=13 ){
if( !is_numeric($dist) || $dist < 0){
$dist = 13;
}
$u_lower = 65; $u_upper = 90;
$l_lower = 97; $l_upper = 122;
$char_count = ($u_upper - $u_lower) +1;
while( $dist > $char_count ){
$dist -= $char_count;
}
$newstr = '';
for( $i=0; $i<strlen($str); ++$i){
$c = ord($str[$i]);
/*
* Check if the character is within the bounds of our function (a-zA-z)
* if not it gets tacked on to the string as is and we move on to the
* next one.
*/
if( $c<$u_lower || $c>$l_upper || ( $c>$u_upper && $c <$l_lower ) ){
$newstr .= chr($c);
continue;
}
$lower = ( $c<=$u_upper?$u_lower:$l_lower);
$upper = ( $c<=$u_upper?$u_upper:$l_upper);
$c += $dist;
if( $c > $upper){
$c = (($c - $upper) + ($lower-1));
}
$newstr .= chr($c);
}
return $newstr;
}
?>
electro at whatever dot com
31-May-2007 09:21
31-May-2007 09:21
<?php
/**
* Rotate each string characters by n positions in ASCII table
* To encode use positive n, to decode - negative.
* With n = 13 (ROT13), encode and decode n can be positive.
*
* @param string $string
* @param integer $n
* @return string
*/
function rotate($string, $n) {
$length = strlen($string);
$result = '';
for($i = 0; $i < $length; $i++) {
$ascii = ord($string{$i});
$rotated = $ascii;
if ($ascii > 64 && $ascii < 91) {
$rotated += $n;
$rotated > 90 && $rotated += -90 + 64;
$rotated < 65 && $rotated += -64 + 90;
} elseif ($ascii > 96 && $ascii < 123) {
$rotated += $n;
$rotated > 122 && $rotated += -122 + 96;
$rotated < 97 && $rotated += -96 + 122;
}
$result .= chr($rotated);
}
return $result;
}
$enc = rotate('string', 6);
echo "Encoded: $enc<br/>\n";
echo 'Decoded: ' . rotate($enc, -6);
?>
maximius at gmail dot com
26-May-2007 01:30
26-May-2007 01:30
Perhaps someone will find this useful ;)
<?
function rotN($s, $n){
$s2 = "";
for($i = 0; $i < strlen($s); $i++){
$char2 = $char = ord($s{$i});
$cap = $char & 32;
$char &= ~ $cap;
$char = $char > 64 && $char < 123 ? (($char - 65 + $n) % 26 + 65) : $char;
$char |= $cap;
if($char < 65 && $char2 > 64 || ($char > 90 && $char < 97 && ($char2 < 91 || $char2 > 96))) $char += 26;
else if($char > 122 && $char2 < 123) $char -= 52;
if(strtoupper(chr($char2)) === chr($char2)) $char = strtoupper(chr($char)); else $char = strtolower(chr($char));
$s2 .= $char;
}
return $s2;
}
?>
It takes any string, $s, and any ROT value, $n. Just like str_rot13, it's both an encoder and decoder. To decode an encoded string, just pass -$n instead of $n.
