ID:               49550
 User updated by:  spoon dot reloaded at gmail dot com
 Reported By:      spoon dot reloaded at gmail dot com
 Status:           Bogus
 Bug Type:         PCRE related
 Operating System: Linux
 PHP Version:      5.3.0
 New Comment:

I found a solution:

echo preg_match('/^|(.(?:|(?1)))$/', 'ab'), "\n";

but I still don't understand why the other one doesn't work


Previous Comments:
------------------------------------------------------------------------

[2009-09-14 10:49:09] spoon dot reloaded at gmail dot com

But that still wouldn't explain why stuff like balanced parentheses
matching /^(\(((?>[^()]+)|(?1))*\))$/ works. I am still waiting for an
explanation on my example.

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

[2009-09-14 10:24:41] spoon dot reloaded at gmail dot com

Nevermind, so I think the reason is that PCRE differs from Perl in that
a recursive "sub-"pattern (i.e. ?1, ?2, etc. but not ?0) only matches
exactly what was matched before by that subgroup, even if there are
other unused possibilities by that group. Is that correct?

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

[2009-09-14 10:06:30] spoon dot reloaded at gmail dot com

> Remove the $ and it works.
Yeah but that changes the meaning. I want to enforce that it matches
the entire string, and it doesn't do that.

To give another example without a $, consider:

echo preg_match('/^(|.(?1))x/', 'abx'), "\n";

Again, it works in Perl, but not in PHP.

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

[2009-09-14 09:51:16] j...@php.net

Remove the $ and it works. And remember that PCRE != Perl.

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

[2009-09-14 08:16:30] spoon dot reloaded at gmail dot com

Description:
------------
I have a recursive PCRE pattern that should match any string (it does
in Perl), but it fails to match a very simple string in PHP. I have
reproduced this on both 5.2 and 5.3.

Reproduce code:
---------------
echo preg_match('/^(|.(?1))$/', 'ab'), "\n";


Expected result:
----------------
I expect it to print "1", because the pattern matches. In Perl, 'ab' =~
/^(|.(?1))$/ indeed matches. In fact, this pattern should match any
string, because it matches either an empty string, or any character
followed by something that matches the main part of the pattern itself
(which matches any string).

Actual result:
--------------
It prints "0", indicating that it did not match.


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


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

Reply via email to