Reputation: 91
I need help trying to get regex to work with double brackets
currently i have this for the regex
(\\[.*?\\])
that allows me to get everything inside a bracket,
HOWEVER my string has double brackets
[DATA1[OTHERDATA]RUBBISH]
the output I get is
[DATA1[OTHERDATA]
is the a way of getting the full bracket including the bracket inside?
Upvotes: 1
Views: 949
Reputation: 21681
Try this one, it does matched brackets ( recursively )
preg_match('/\[(?:[^\[\]]*+|(?0))*\]/', $string, $match );
Shown here
https://regex101.com/r/oL4kH5/2
For example given this
[DATA1[OTHERDATA]RUBBISH] hello [something]
You will get these 2 matches
[DATA1[OTHERDATA]RUBBISH]
[something]
It will also differentiate between matched brackets, for example:
[DATA1[OTHERDATA]RUBBISH[hello] hello [something]
will return 3 matches
[OTHERDATA]
[hello]
[something]
This is because the first bracket is unmatched.
Upvotes: 0
Reputation: 76408
Keeping things nice and simple. A greedy match should do the trick:
/\[(.+)\]/
the .+
will match any character, but it'll stop at the last ]
, so the match will be "DATA1[OTHERDATA]RUBBISH"
Breakdown is really simple:
\[
: Matches literal [
(.+)
: Match (and capture) all characters - including opening and closing brackets\]
: Match literal ]
Regardless of how many nested brackets you have the results are the same:
[data[foo][bar][eve[n]]more]
//match:
data[foo][bar][eve[n]]more
Upvotes: 3
Reputation: 43199
Yep:
(\[([^\[\]]|(?R))*\])
This uses a recursive regex, see a demo on regex101.com.
Upvotes: 0
Reputation: 786261
In PCRE you can use this recursive regex:
$re = '/(
\[
(
(?:[^][]+|(?1))*
)
\]
)/x';
Upvotes: 0
Reputation: 627507
You may use a recursive regex like
\[(?:[^][]++|(?R))*]
See the regex demo
Details:
\[
- a literal opening [
(?:[^][]++|(?R))*
- one or more sequences of:
[^][]++
- 1 or more chars other than [
and ]
(matched possessively)|
- or(?R)
- recurse the whole pattern]
- a literal closing bracket.Upvotes: 1