| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2001-05-04 11:44 UTC] smoonen at andstuff dot org
 The following code succeeds on PHP 4.03 and PHP 4.04pl1, but fails on PHP 4.05:
  $str = "abc'\\\\''def";
  function f($s) { return "x"; }
  print preg_replace("/c(.*)d/e", "f('\\1')", $str, -1);
This seems to expose *two* underlying bugs:
  1) There appears to be some problem in the regex state
     machine
  2) There is a definite problem with the replacement of
     the backreference with its corresponding string.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Tue Nov 04 07:00:01 2025 UTC | 
Can you explain why you think it fails? The following sample (slightly modified from yours to dump the $s parameter to function): $str = "abc'\\\\''def"; function f($s) { var_dump($s); return "x"; } print preg_replace("/c(.*)d/e", "f('\\1')", $str); outputs: string(5) "'\\''" abxef As it should.Oddly, I get the following error: Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /home/groups/t/ta/tavi/htdocs/playground/test.php(4) : regexp code on line 1 Parse error: parse error in /home/groups/t/ta/tavi/htdocs/playground/test.php(4) : regexp code on line 1 Fatal error: Failed evaluating code: f('\'\\\\'\'') in /home/groups/t/ta/tavi/htdocs/playground/test.php on line 4 PHP compile options may be seen at: http://tavi.sourceforge.net/playground/phpinfo.phpOk, I made a little mistake, use "f('\\\\1')" rather than "f('\1')".H'm... I'm confused. :-) To complicate things further, the e-mails display half as many backslashes as the web page. :-) Since I'm not sure what you mean, I'll exhaustively list the behaviors: The following: $str = "abc'\\\\''def"; function f($s) { var_dump($s); return "x"; } print preg_replace("/c(.*)d/e", "f('\\1')", $str); gives the error messages I posted earlier. (That's two backslashes before the 1.) The following: $str = "abc'\\\\''def"; function f($s) { var_dump($s); return "x"; } print preg_replace("/c(.*)d/e", "f('\\\\1')", $str); gives the result: string(2) "\1" abxef which isn't what I want. (That's four backslashes before the 1.) Prefixing the "1" with one or three backslashes in each case emits an ASCII x'01'. None of which are what I want to occur...