Hi,

I have read PHP bug #15050 and PHP bug #10666. Example at bottom of this
mail.

Andrei states in bug #10666: "The fact that it backslash-escapes single
and double quotes in matches before substituting $1 is a feature, not a
bug, otherwise you'd have a really hard time figuring out which quotes
go where when using evaluation strings."

I assume that the result of '$1' would be
        'A \"little\" test and a \'little\' test'
.. evaluating to:
        A \"little\" test and a 'little' test

This approach to handle $1 (by adding slashes) is ugly and pretty much a
hack in my opinion. Is there really no way at all to consider $1 as a
"real" variable? After all, there is no pain in perl running stuff like:
s/(.*)/"$1 [".length($1)." characters]"/e;
.. where the string includes ' and "

As it currently is, any function called in /e would always require a
wrapper to run stripslashes() - which could also be destructive since
only one of ' and " is escaped in the eval'ed string parsed on to a
function.

This currently render the otherwise powerful /e-feature pretty useless.
At least, the behaviour ought to be mentioned under the /e-flag at
pcre.pattern.modifiers in the manual?

(actually, it seems that the whole adaption of pcre has been performed
without much consideration - even though it has been more structured,
there are still leftovers such as delimiters, which only made sense in
the shorthand-form present in perl, but not in a structured function
with several arguments - flags might also have been moved into an argument
for itself... it's a pity since there are many benefits from preg_*
opposed to ereg_* such as speed, flexibility, more powerful features,
etc...)




Quick example, for the curious: (PHP4.3.8, PHP5.0.0)

<?php
$string = <<<EOD
A "little" test and a 'little' test
EOD;
print preg_replace('_(.*)_e',"'$1'",$string)."\n";
print preg_replace('_(.*)_e','"$1"',$string)."\n";
?>

Expected result:
A "little" test and a 'little' test
A "little" test and a 'little' test

Actual result:
A \"little\" test and a 'little' test
A "little" test and a \'little\' test

magic_quotes_runtime is disabled (and unimportant, so is magic_quotes_gpc).

-- 
- Peter Brodersen
  (trying not to be too much of a party pooper :)

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to