|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-09-14 08:16 UTC] 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.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Dec 06 15:00:02 2025 UTC |
> 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.I found a solution: echo preg_match('/^|(.(?:|(?1)))$/', 'ab'), "\n"; but I still don't understand why the other one doesn't workoops in that last one I meant echo preg_match('/^$|^(.(?:|(?1)))$/', 'ab'), "\n";oops my previous workaround still doens't work echo preg_match('/^$|^(.(?:|(?1)))$/', 'abc'), "\n";