Edit report at https://bugs.php.net/bug.php?id=62646&edit=1

 ID:                 62646
 Updated by:         fel...@php.net
 Reported by:        Andreas dot Klauer at metamorpher dot de
 Summary:            Impossible to escape/match delimiters within \Q \E
-Status:             Open
+Status:             Not a bug
 Type:               Bug
 Package:            PCRE related
 PHP Version:        5.3.15
 Block user comment: N
 Private report:     N

 New Comment:

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

Hi, the pcretest tool doesn't even handle the \Q..\E stuff as you mentioned. It 
works just like the [..] one. And using Perl I did to escape the delimiter 
inside \Q..\E.


Previous Comments:
------------------------------------------------------------------------
[2012-07-24 00:33:54] Andreas dot Klauer at metamorpher dot de

Description:
------------
PCRE allows literal matches of strings between \Q and \E. This is also 
documented, \Q.$.\E will match literal .$.

However, if that literal string contains the regexp delimiter (/ or # or ~ or 
() or whichever you choose), the regexp compile either fails, or the match 
fails because it tries to match the escape char used to escape the delimiter.

The problem is php_pcre::pcre_get_compiled_regex_cache() which parses the 
delimiter, not taking \Q \E in account. Delimiters between \Q \E should be 
treated as literal characters, not delimiters (that's what Perl does); or 
alternatively if delimiters have to be escaped, the escape char should be 
removed from the pattern.

Workaround: Use preg_quote() instead of \Q \E if there's a chance the delimiter 
may appear within \Q \E

Test script:
---------------
preg_replace("/\Q/#~\E/", ...);
=> Warning: preg_replace(): Unknown modifier '#' in php shell code on line 1

preg_replace("/\Q\/#~\E/", "OK", "/#~");
=> "/#~" (expected "OK")

preg_replace("/\Q\/#~\E/", "FAIL", "\/#~")
=> "FAIL" (expected "\/#~");




------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=62646&edit=1

Reply via email to