Okay so I'm working on a project where I need a regex that can match a * followed by 1-4 spaces or tabs and then followed by a row of text. Right now I'm using .* after the lookbehind for testing purposes. However I can get it to match explicitly 1, 2, or 4 spaces/tabs but not 1-4. I'm testing against the following block
* test line here
* Second test
* Third test
* Another test
And these are the two patterns I'm testing (?<=(\*[ \t]{3})).*
which works just as expected and matches the 2nd line, same if I replace 3 with 1, 2 or 4 however if I replace it with 1,4 forming the following pattern (?<=(\*[ \t]{1,4})).*
it no longer matches any of the rows and I honestly can't understand why. I've tried googling without success. I'm using the g(lobal) flag.
PHP, like many flavors, doesn't support variable length lookbehind. The only support is alternation (
|
) at the top level of the lookbehind. Even a?
can break the pattern. An alternative is to use:Or better, abort the lookbehind for a group:
This should work well for you, since it doesn't seem like you have overlapping of your matches anyway.
From the manual:
Source: http://www.php.net/manual/en/regexp.reference.assertions.php