Jinsong Li Jinsong Li - 2 months ago 7
PHP Question

regular expression to match tag with or without close tag?

I am struggling with detect these patterns in a content body:

[tagname blah blah blah]blah blah blah[/tagname] // pattern 1: with close tag

[tagname blah blah blah] //pattern 2: without close tag


Pattern examples:

[vimeo align='center' id='123']//player.vimeo.com/video/123[/vimeo]


[vimeo align='left' id='123']


Right now I came up with this regular expression capturing both:

/\[(?<name>vimeo)[^\]]+\](?:(.*?)\[\/\g<name>\])?/


Notice there is a
?
at the end of
(?:(.*?)\[\/\g<name>\])
to make the subpattern optional. But there is a problem with this. It will falsely match
[vimeo align='center' id='123']//player.vimeo.com/video/123[/youtube]
(notice the closing tag is
youtube
not
vimeo
now)

Can anyone help me to fix this regular expression? Thanks!

Answer

You can use this regex:

\[(?<name>vimeo)[^\]]+\](?:(.*?)\[\/\g<name>\]|(?![^[]*\[\/))

instead of making the end tag optional, I'll look foward to check if there isn't anty closing tag

Regex101