From:             trex0003 at umn dot edu
Operating system: CentOS
PHP version:      Irrelevant
PHP Bug Type:     Documentation problem
Bug description:  Escaped backslash in PCRE regex documentation

Description:
------------
Documentation of how PCRE regex behaves with escaped backslashes is
confusing as written in current documentation:

http://php.planetmirror.com/manual/en/reference.pcre.pattern.syntax.php

Perhaps this just means an expansion of the note:

"Note:  Single and double quoted PHP strings have special meaning of
backslash. Thus if \ has to be matched with a regular expression \\, then
"\\\\" or '\\\\' must be used in PHP code."

While trying to use preg_split to break a string at non-escaped string
quotes, I tried using a negative lookbehind assertion (see code below).
With all other escaped characters in the lookbehind assertion, you only
need one backwards slash before the escaped character (e.g., "(?<!\s)"
works); but if you want to escape a backslash, you need to escape it twice
(e.g., "(?<!\\\)" works but "(?<!\\)" does not). 

Based on the documentation's statement 'In particular, if you want to
match a backslash, you write "\\".' it seems that (?<!\\) should work, and
the extra information in the Note is too terse to explain why.

Perhaps this is actually a bug, but I can't tell if it's normal behavior
that could be clarified more in documentation.

The closest I could find for bug reports to this issue is here:

http://bugs.php.net/bug.php?id=22315

...but this only implies the difference in behavior without explaining
why.

Reproduce code:
---------------
$string = "This sentence is not quoted. 'But this one is, and it contains
\'escaped quotes\' within!'";

$needle = "/(?<!\\)'/";
$results = preg_split($needle, $string);

print_r($results);

Expected result:
----------------
Array
(
    [0] => This sentence is not quoted. 
    [1] => But this one is, and it contains \'escaped quotes\' within!
    [2] => 
)

// Adding a third backslash to the $needle gives this result.

Actual result:
--------------
Warning: preg_split() [function.preg-split]: Compilation failed: missing )
at offset 7 in /data/domains/lawweb3.law.umn.edu/public/php/regex.php on
line 16

-- 
Edit bug report at http://bugs.php.net/?id=41739&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=41739&r=trysnapshot44
Try a CVS snapshot (PHP 5.2): 
http://bugs.php.net/fix.php?id=41739&r=trysnapshot52
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=41739&r=trysnapshot60
Fixed in CVS:                 http://bugs.php.net/fix.php?id=41739&r=fixedcvs
Fixed in release:             
http://bugs.php.net/fix.php?id=41739&r=alreadyfixed
Need backtrace:               http://bugs.php.net/fix.php?id=41739&r=needtrace
Need Reproduce Script:        http://bugs.php.net/fix.php?id=41739&r=needscript
Try newer version:            http://bugs.php.net/fix.php?id=41739&r=oldversion
Not developer issue:          http://bugs.php.net/fix.php?id=41739&r=support
Expected behavior:            http://bugs.php.net/fix.php?id=41739&r=notwrong
Not enough info:              
http://bugs.php.net/fix.php?id=41739&r=notenoughinfo
Submitted twice:              
http://bugs.php.net/fix.php?id=41739&r=submittedtwice
register_globals:             http://bugs.php.net/fix.php?id=41739&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=41739&r=php3
Daylight Savings:             http://bugs.php.net/fix.php?id=41739&r=dst
IIS Stability:                http://bugs.php.net/fix.php?id=41739&r=isapi
Install GNU Sed:              http://bugs.php.net/fix.php?id=41739&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=41739&r=float
No Zend Extensions:           http://bugs.php.net/fix.php?id=41739&r=nozend
MySQL Configuration Error:    http://bugs.php.net/fix.php?id=41739&r=mysqlcfg

Reply via email to