Re: preg_replace() in 4.0.4
| From: | Monte Ohrt | Date: | Mon, 08 Jan 2001 14:15:50 +0000 |
| Subject: | Re: preg_replace() in 4.0.4 | ||
| References: | 1 2 3 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-33223@lists.php.net to get a copy of this message | ||
Ah, there is a bug in PHP 4.0.4 :-) Upgrade to the latest CVS to fix
this.
Also, preg_quote() is a good way to escape any special characters in the
replace array.
Monte
Daniel Baldoni wrote:
>
> G'day Monte (and list),
>
> My original query was:
> >> With the upgrade to 4.0.4, preg_replace() now does substitutions for $n in
> >> the replacement strings (I say strings, because it's the easiest way of
> >> doing mass substitutions over an array). This has caused me severe grief
> >> (as there doesn't appear to be any way to stop it).
> >>
> >> I have an application which reads in a PostScript template file and
> >> replaces occurrences of '@' delimited strings with specific values
> >> (basically, a "variable subsituter"). Some of the replacement strings may
> >> contain dollar amounts and so a '$' may (or may not) be present. If a
> >> '$'
> >> is present in a string, it will be followed by a digit. When I call
> >> preg_replace() in this application, all 3 arguments are arrays.
> >> ...[text deleted]...
>
> To which Monte replied:
> > escape the $ signs in the replace array first, so $1 becomes \$1, etc.
>
> The problem with that is that you then end up with a "\$1" literally in the
> final array. That may be fine if you're just doing something purely within
> PHP, but in this case the data is being written as part of a PostScript
> output stream.
>
> The actual code is something along the lines of:
>
> $pat = array('@v1@', '@v2@', ... '@vn@'); //
> Constant strings
> $rplc = array($a, $b, $c, 1, 1, ..., $n);
> $new = preg_replace ($orig, $rplc, $tmplt);
>
> If, for example, $b contains '$1,234.56' the replacement for '@v2@' becomes
> ',234.56'. If the '$' is escaped, the replacement is literally
> '\$1,234.56'.
> To complicate things further, $b may not be a "dollar value", but text along
> the lines of 'N/A'.
>
> In my case, I don't actually want to do regular-expression substitution but
> straightforward text substitution. But, as the arguments are all arrays
> (lots of "variables" to be replaced by "values" in a pre-processed
> template),
> I can't just use str_replace().
>
> Any suggestions would be much appreciated. Thanks.
>
> --
> -------------------------------------------------------+---------------------
> Daniel Baldoni BAppSc, PGradDipCompSci | Technical Director
> require 'std/disclaimer.pl' | LcdS Pty. Ltd.
> -------------------------------------------------------+ 856B Canning Hwy
> Phone/FAX: +61-8-9364-8171 | Applecross
> Mobile: 041-888-9794 | WA 6153
> URL: http://www.lcds.com.au/ |
> Australia
> -------------------------------------------------------+---------------------
> "Any time there's something so ridiculous that no rational systems programmer
> would even consider trying it, they send for me."; paraphrased from "King Of
> The Murgos" by David Eddings. (I'm not good, just crazy)
--
Monte Ohrt <monte@ispi.net>
http://www.ispi.net/