user5551022 user5551022 - 4 months ago 12
PHP Question

Regex any characters except one specific, with break line PHP

I would like to build a regex that grep all characters between [[xxx]], with new line.

[[dgghr]]
[[dfgdfgfd
dgfsdgdg]]

/\[\[([\s\S]+)\]\]/s


But this regex grep :

"df]]
[[df
d
gfdg"


I would like :

"dgghr" and "dfgdfgfd
dgfsdgdg"


I tried to exclude "]" character, without success :(
Thank you for all.
G.

Edit



I've just finded! Here the solution :
String :

[[dgghr]]
[[dfgdfgfd
dgfsdgdg]]


Regex :

/\[\[([\s\S][^\]]+)\]\]/s


Output :

array('dgghr', 'dfgdfgfd\ndgfsdgdg')


Thank you MariaDeleva and splash58
G.

Answer

To exclude a character, use a negated class : [^x] matches any character but x. Since ] has a special meaning in character classes, you have to escape it : [^\]]

Now simply excluding ] could give you undesirable results if the text bewteen double brackets can contain brackets : \[\[[^\]]*\]\] wouldn't match [[this]test]].

I believe the only problem with your regex is that it is greedy : it will match as much as it can, rather than stopping to the first match, so the [\S\s] class will match closing brackets as long as there are others that can be matched by \]\] later.
So what I propose is to make your [\S\s]+ part lazy/non-greedy, as in the following :

/\[\[([\s\S]+?)\]\]/s

You can try it on regex101.

Comments