On Thu, May 27, 2010 at 4:13 AM, Andre Polykanine <andre@xxxxxxxx> wrote: > Hello Adam, > > You did understand me exactly and perfectly). > Ordering arrays is a good idea but I don't know how to do that > exactly. > For instance, there's a cypher called Polybius square. You write in > the alphabet in a grid like this: > 1 a b c d e > 2 f g h i j > 3 k l m n o > 4 p q r s t > 5 u v w x y > 6 z > > There is a way where i/j are equal to make a 5 by 5 square but for me > it's equal since I'm working with a 33-letter Russian alphabet, so no > way to make it a perfect square. > Anyway, a letter has two coordinates and is represented by a two-digit > number. For example, E is 15, K is 21, Z is 61 and so on. > So we have a word, say, PHP. It will look like this: 412341. > What does preg_replace do? Exactly, it's searching 41, then 12, then > 23, and so on. > I tried to make a loop: > $length=mb_strlen($str); > for ($i=0; $i<$length; $i+=2) { > $pair=mb_substr($str, $i, 2); > $pair=preg_replace($numbers, $letters, $str); > } > > It already smells something not good, but anyway. > If I do that, I have one more problem: say, we have a phrase "PHP is > the best". So we crypt it and get: > 412341 2444 452315 12154445 > Then the parser begins: "41=>p, 23=>h, 41=>p, (attention!) \s2=>...." > I marked a whitespace as \s so you see what happens. > I might split the string by spaces but I can't imagine what a user > inputs: it might be a dash, for example... > Sorry for such a long message but I'm really annoyed with this > preg_replace's behavior. And it's not the only one task to > accomplish... > Thanks a lot! > > -- > With best regards from Ukraine, > Andre > Skype: Francophile; Wlm&MSN: arthaelon @ yandex.ru; Jabber: arthaelon @ > jabber.org > Yahoo! messenger: andre.polykanine; ICQ: 191749952 > Twitter: m_elensule > > ----- Original message ----- > From: Adam Richardson <simpleshot@xxxxxxxxx> > To: php-general@xxxxxxxxxxxxx <php-general@xxxxxxxxxxxxx> > Date: Thursday, May 27, 2010, 7:56:28 AM > Subject: One more time about regexes > > On Wed, May 26, 2010 at 11:10 PM, Nilesh Govindarajan <lists@xxxxxxxxxx > >wrote: > > > ---------- Forwarded message ---------- > > From: Nilesh Govindarajan <lists@xxxxxxxxxx> > > Date: Thu, May 27, 2010 at 8:40 AM > > Subject: Re: One more time about regexes > > To: Andre Polykanine <andre@xxxxxxxx> > > > > > > On Thu, May 27, 2010 at 3:33 AM, Andre Polykanine <andre@xxxxxxxx> > wrote: > > > Hello everyone, > > > > > > Sorry, but I'm asking one more time (since it's really annoying me and > > > I need to apply some really dirty hacks): > > > Is there a way making preg_replace() pass through the regex one single > > > time searching from left to right and not to erase what it has already > > > done? > > > I can give you a real task I'm accomplishing but the tasks requiring > > > that tend to multiply... > > > Thanks a lot! > > > > > > -- > > > With best regards from Ukraine, > > > Andre > > > Http://oire.org/ - The Fantasy blogs of Oire > > > Skype: Francophile; Wlm&MSN: arthaelon @ yandex.ru; Jabber: arthaelon > @ > > jabber.org > > > Yahoo! messenger: andre.polykanine; ICQ: 191749952 > > > Twitter: http://twitter.com/m_elensule > > > > > > > > > -- > > > PHP General Mailing List (http://www.php.net/) > > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > > > > > > > > > If you don't want to replace the stuff it has searched then use > preg_match > > ! > > > > -- > > Nilesh Govindarajan > > Facebook: nilesh.gr > > Twitter: nileshgr > > Website: www.itech7.com > > > > > > > > -- > > Nilesh Govindarajan > > Facebook: nilesh.gr > > Twitter: nileshgr > > Website: www.itech7.com > > > > -- > > PHP General Mailing List (http://www.php.net/) > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > > If I'm understanding correctly, Andre, you want to perform a replace > operation, but you're observing that there's an element of recursion > happening (e.g., you replace one item with its replacement, and then the > new > replacement is also replaced.) > > To my knowledge, this won't happen with a standard preg_replace(): > > $string = 'Bil & Tom & Phil'; > $pattern = '/&/'; > $replacement = '&'; > // outputs Bil & Tom & Phil > echo preg_replace($pattern, $replacement, $string); > > However, if you're using arrays to pass in the patterns and replacements, > then one array item could later be replaced by another (see comment and > example on this page by info at gratisrijden dot nl): > http://php.net/manual/en/function.preg-replace.php > > If that's the case, you have to carefully structure the order of the array > items so-as to preclude one replacement having the opportunity to override > a > subsequent replacement. > > Sorry if I misunderstood. You might want to create a simple example of > code > showing what you're working through. > > Adam > > > -- > Nephtali: PHP web framework that functions beautifully > http://nephtaliproject.com > > Andre, I'd try something like this: <?php /** * Description of PolybiusSquare * * @author Adam Richardson, creator of the Nephtali Web Framework */ class PolybiusSquare { public $square_values; /** * Creates PolybiusSquare instance for encoding and decoding strings. * * @param string $values_string The string containing the characters to be be encoded using the generated grid. * @param string $square_dimension Square dimension of the grid. */ function __construct($values_string, $square_dimension){ $this->square_values = array(); $chars = str_split($values_string); for ($i = 1; $i < ($square_dimension + 1); $i++){ for ($j = 1; $j < ($square_dimension + 1); $j++){ $key = "$i"."$j"; $this->square_values[$key] = array_shift($chars); } } } /** * Encodes text using the grid created during creation of the object. * * Of note, strings are converted to lower-case representations before encoding, although if you were using a larger square, you could just include the capitals as possible encodings, too. * * @param string $plain_text * @return string */ public function encode($plain_text){ $chars_to_encode = str_split(strtolower($plain_text)); $encoded_chars = array(); foreach ($chars_to_encode as $char_to_encode){ if (($result = array_search($char_to_encode, $this->square_values)) !== false){ $encoded_chars[] = $result; }else{ // store without encoding, but double up to make decoding easier $encoded_chars[] = $char_to_encode.$char_to_encode; } } return implode($encoded_chars); } /** * Decodes cipher text produced through encode() method, using the same grid. * * @param string $cipher_text * @return string */ public function decode($cipher_text){ $chars_to_decode = str_split($cipher_text, 2); $decoded_chars = array(); foreach ($chars_to_decode as $char_to_decode){ if (($result = array_key_exists($char_to_decode, $this->square_values)) !== false){ $decoded_chars[] = $this->square_values[$char_to_decode]; }else{ // store without encoding just the first character $decoded_chars[] = current(str_split($char_to_decode)); } } return implode($decoded_chars); } } $ps = new PolybiusSquare($values_string = 'abcdefghijklmnopqrstuvwxyz0123456789', $square_dimension = 6); echo "'PHP is Great' encodes as:" . $ps->encode($string = 'PHP is Great'); echo "'PHP is Great' decoded after being encoded:" . $ps->decode($string = $ps->encode($string = 'PHP is Great')); ?> -- Nephtali: PHP web framework that functions beautifully http://nephtaliproject.com