# [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