# [EMAIL PROTECTED] / 2006-10-11 09:52:51 +0200:
> 
> 10 okt 2006 kl. 19.25 skrev Roman Neuhauser:
> 
> ># [EMAIL PROTECTED] / 2006-10-09 22:01:34 +0200:
> >>Thank you Ilaria and Roman for your input. I did not know that preg
> >>is able to deal with PCRE patterns.
> >
> >    "preg" is obviously short for "Perl REGular expressions", while
> >    PCRE positively means Perl-Compatible Regular Expressions.
> >    The regexp syntax from Perl is a superset of POSIX "extended"
> >    regexps, so anything ereg_ function accept will be good for
> >    preg_ as well (but beware of pattern delimiters).
> 
> Thanks for the info. I didn't know that.

    NP, glad to be of help. The relationship is quite obvious if you
    look at both syntaxes.

> >>As a matter of fact I came up
> >>with the following solution (if someone is interested):
> >
> >    What problem does it solve? I mean, why are you trying to avoid
> >    preg_replace_callback() in the first place?
> >
> 
> Maybe because I didn't know better?

    Well your question mentioned preg_replace_callback() so I thought
    maybe there was something about the function you didn't like.

> Initially, I was using  ereg_replace for replacing metric numbers with
> imperial ones. But  obviously, ereg_replace replaces all instances in
> the given text  string. A text containing more than one instance of
> the same unit,  was replaced by the calculated replacement string of
> the first  finding. So I had to think about other ways to do this -
> which  brought me to preg_replace_callback (as I already said - I
> didn't  know that preg takes POSIX patterns as well).
> 
> Would you suggest a different way? Would it be faster to do the  
> replacement with preg_replace_callback compared to the function I wrote?

    Definitely, and probably by several orders of magnitude.

> A page like this one: http://www.nikehydraulics.com/products/ 
> product_chooser_gb.php?productMaingroup=5&productSubgroup=33
> 
> .. gets converted within 0.32 / 0.34 seconds which I think is quite ok.

    If the time covers only the conversion then it's quite terrible.

    Looking at the convertTextString() function below there's a few
    obvious optimizations waiting to be done, and... turning the foreach
    into a single preg_replace_callback() is the one that begs
    implementing the most (the code below's been tested and works):

    class convertor
    {
        const SI_to_Imperial = 0;
        const Imperial_to_SI = 1;

        function convert($amount, $unit, $direction)
        {
            return sprintf(
                "whatever '%s' of '%s' is in the Imperial system"
              , $amount
              , $unit
            );
        }
    }
    function callbackSI2IS(array $SIspec)
    {
        return convertor::convert(
            $SIspec[1]
          , $SIspec[2]
          , convertor::SI_to_Imperial
        );
    }

    $p = '~
            ((?:\d+[,|.])*\d+) # amount
            \s*
            (m{1,2}\b) # meters or millis
         ~x';
    echo preg_replace_callback(
        $p
      , 'callbackSI2IS'
      , file_get_contents('php://stdin')
    );


> >>the function takes a text and an array with converters like:
> >>
> >>$converters[] = array (     "metric" => "mm", "imperial" => "in",
> >>"ratio"  => 0.039370079, "round" => 1 );
> >>$converters[] = array (     "metric" => "m", "imperial" => "ft", "ratio"
> >>=> 3.280839895, "round" => 1 );
> >>
> >>
> >>function convertTextString ( $text, $convertTable )
> >>{
> >>    # this function takes a text string, searches for numbers to
> >>convert, convert those numbers and returns
> >>    # the complete text again.
> >>
> >>    if ( !ereg ( "[[:digit:]]", $text ) ) // if the text does not
> >>contain any numbers, return the text as it is
> >>    {
> >>            return $text;
> >>    }
> >>    
> >>    foreach ( $convertTable as $convertKey => $convertUnit )
> >>    {
> >>            $pattern =
> >>            "((\d{1,10}[,|.]*\d{0,10})*(\s)(%s)([$|\s|.|,|\)|/]+| $))"; 
> >>            //  this regex
> >>looks for a number followed by white space,  followed by the  
> >>metric unit,
> >>followed by a closing character like  ".", "," or ")"
> >>            $pattern = sprintf ( $pattern, $convertUnit['metric'] );
> >>            
> >>            while ( preg_match ( $pattern, $text, $matches ) )
> >>            {
> >>                    $matches[1] = str_replace ( ",", ".", $matches[1] );
> >>                    // in case  numbers are written like "6,6 m", we 
> >>                    need to  replace "," with
> >>"."
> >>                    // because we do not want to return 0, we have to
> >>                    make shure that  the new value is not zero.
> >>                    $itterator = 0;
> >>                    do {
> >>                            $value = round ( ( $matches[1] *
> >>                            $convertUnit['ratio'] ),  
> >>                            $convertUnit['round'] + $itterator  );
> >>                            ++$itterator;
> >>                    } while ( $value == 0 || $itterator == 10 );
> >>                    
> >>                    $replacement = $value . "$2" .
> >>                    $convertUnit['imperial'] . "$4";
> >>                    $text = preg_replace ( $pattern, $replacement,
> >>                    $text, 1 );
> >>            }
> >>    }
> >>    return $text;
> >>}

-- 
How many Vietnam vets does it take to screw in a light bulb?
You don't know, man.  You don't KNOW.
Cause you weren't THERE.             http://bash.org/?255991

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to