php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #62756 preg documentation should mention '=' should not be first in character class
Submitted: 2012-08-06 11:32 UTC Modified: 2013-10-24 14:44 UTC
Votes:1
Avg. Score:5.0 ± 0.0
Reproduced:0 of 0 (0.0%)
From: marco at greenlightsolutions dot nl Assigned: daverandom (profile)
Status: Closed Package: Documentation problem
PHP Version: Irrelevant OS:
Private report: No CVE-ID: None
 [2012-08-06 11:32 UTC] marco at greenlightsolutions dot nl
Description:
------------
---
From manual page: http://www.php.net/regexp.reference.character-classes
---
Briefly: The documentation for character classes should state that '=' after '[' is a reserved construct and should be avoided.

In detail:
If you put a '=' first in a character class in a perl regular expression, such as '[=~]', in certain versions of PHP (including PHP 5.3.8) this will fail to compile, with a warning "Compilation failed: POSIX collating elements are not supported". Rewriting it as '[~=]' prevents the error message.
This is because the combination "[=" is seen as indicative of a "POSIX collating element", a reserved, not-yet-implemented syntactical construct. A full description of the cause was written up by Tom Christiansen at http://stackoverflow.com/questions/7173787/compilation-failed-posix-collating-elements-are-not-supported#7175589.
The 'preg character classes' documentation page should include the information that '=' in the beginning of a character class is treated special, but it doesn't mention the '=' sign at all.



Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2012-08-06 12:32 UTC] salathe@php.net
[=~] should not be causing the warning, however [=abc=] and [.abc.] will.
 [2012-08-06 12:58 UTC] marco at greenlightsolutions dot nl
You are right.
It actually was part of a compound expression, and I'd overlooked that the other parts were also relevant. The following line generates the error message:
  $x=preg_match("%[=~]|<[>=]%", "test");
(PHP 5.3.8, PCRE 8.13.2011-08-16).

Regardless, the documentation does not mention the '[=..=]' POSIX collating-element construct. It does not mention the '=' symbol at all. This should be fixed in the documentation. Ideally, the documentation should also contain the phrase 'POSIX collating element', so that it appears as a search result when people search for the text of the error message.
 [2013-10-23 08:40 UTC] daverandom@php.net
Automatic comment from SVN on behalf of daverandom
Revision: http://svn.php.net/viewvc/?view=revision&amp;revision=331924
Log: Document difference between PCRE and POSIX character classes. Fixes bug #62756.
 [2013-10-23 08:41 UTC] daverandom@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: daverandom
 [2013-10-23 08:41 UTC] daverandom@php.net
This bug has been fixed in the documentation's XML sources. Since the
online and downloadable versions of the documentation need some time
to get updated, we would like to ask you to be a bit patient.

Thank you for the report, and for helping us make our documentation better.

Documented at http://php.net/reference.pcre.pattern.posix
 [2013-10-23 12:53 UTC] marco at greenlightsolutions dot nl
The amended documentation is slightly inaccurate.
The documentation states
"Supplying an expression with a character class that both starts and ends with <literal>:</literal>, <literal>.</literal> or <literal>:</literal> characters to PCRE is interpreted as an attempt to use one of these unsupported features and causes a compilation error."
Unfortunately, the compilation error is also triggered when "supplying an expression with a character class that start with a <literal>:</literal>, <literal>.</literal> or <literal>:</literal> character, followed by a different character class that ends with that same literal".

Also, I strongly urge you to formulate the text in such a way that it includes the phrase "POSIX collating elements", so that the page will be a top search result when searching for the error message "Compilation failed: POSIX collating elements are not supported".
 [2013-10-24 09:35 UTC] daverandom@php.net
Automatic comment from SVN on behalf of daverandom
Revision: http://svn.php.net/viewvc/?view=revision&amp;revision=331945
Log: Refactored disallowed POSIX bracket elements to match PCRE error message, per request on bug #62756
 [2013-10-24 09:40 UTC] daverandom@php.net
I've reworded the disallowed element list to match the error message as suggested.

Note however that the "followed by a different character class that ends with that same literal" is not actually correct, also note that I cannot reproduce the error with the second example %[=~]|<[>=]% (http://3v4l.org/sdJ5M) - it's possible this was a bug in an earlier version of PCRE.

The true rules relate to the fact that \ is not an escape character in POSIX bracket expressions, and in reality there *should* be no conflicts (the only way to cause a conflict would be with an empty character class []), and this is somewhat beyond the scope of the PCRE documentation.

More information on the POSIX sequences that are the root cause of this problem can be found at http://www.regular-expressions.info/posixbrackets.html.
 [2013-10-24 14:44 UTC] marco at greenlightsolutions dot nl
You're right, I get the error message with my original use-case on a machine with PHP 5.3.8 using PCRE 8.13.2011-08-16, but not on a different machine with PHP 5.3.17 using PCRE 8.31 2012-07-06. Upon checking the PCRE changelog at http://www.pcre.org/changelog.txt, I find this bug was noted and fixed in PCRE version 8.20.

Thanks for making the changes!
 
PHP Copyright © 2001-2026 The PHP Group
All rights reserved.
Last updated: Thu Oct 08 03:00:02 2026 UTC