+ // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()
+ // Also, see shortcode_unautop() and shortcode.js.
+ return
+ '\\[' // Opening bracket
+ . '(\\[?)' // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
+ . "($tagregexp)" // 2: Shortcode name
+ . '(?![\\w-])' // Not followed by word character or hyphen
+ . '(' // 3: Unroll the loop: Inside the opening shortcode tag
+ . '[^\\]\\/]*' // Not a closing bracket or forward slash
+ . '(?:'
+ . '\\/(?!\\])' // A forward slash not followed by a closing bracket
+ . '[^\\]\\/]*' // Not a closing bracket or forward slash
+ . ')*?'
+ . ')'
+ . '(?:'
+ . '(\\/)' // 4: Self closing tag ...
+ . '\\]' // ... and closing bracket
+ . '|'
+ . '\\]' // Closing bracket
+ . '(?:'
+ . '(' // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
+ . '[^\\[]*+' // Not an opening bracket
+ . '(?:'
+ . '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
+ . '[^\\[]*+' // Not an opening bracket
+ . ')*+'
+ . ')'
+ . '\\[\\/\\2\\]' // Closing shortcode tag
+ . ')?'
+ . ')'
+ . '(\\]?)'; // 6: Optional second closing brocket for escaping shortcodes: [[tag]]