Re: Re[2]: One more time about regexes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 = '&amp;';
> // outputs Bil &amp; Tom &amp; 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

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux