# frank.arensmeier@xxxxxxxxxxxxxxxxx / 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). > 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? > 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