WordPress Version: 6.5
/**
* Retrieves the shortcode regular expression for searching.
*
* The regular expression combines the shortcode tags in the regular expression
* in a regex class.
*
* The regular expression contains 6 different sub matches to help with parsing.
*
* 1 - An extra [ to allow for escaping shortcodes with double [[]]
* 2 - The shortcode name
* 3 - The shortcode argument list
* 4 - The self closing /
* 5 - The content of a shortcode when it wraps some content.
* 6 - An extra ] to allow for escaping shortcodes with double [[]]
*
* @since 2.5.0
* @since 4.4.0 Added the `$tagnames` parameter.
*
* @global array $shortcode_tags
*
* @param array $tagnames Optional. List of shortcodes to find. Defaults to all registered shortcodes.
* @return string The shortcode search regular expression
*/
function get_shortcode_regex($tagnames = null)
{
global $shortcode_tags;
if (empty($tagnames)) {
$tagnames = array_keys($shortcode_tags);
}
$tagregexp = implode('|', array_map('preg_quote', $tagnames));
/*
* WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag().
* Also, see shortcode_unautop() and shortcode.js.
*/
// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
return '\[' . '(\[?)' . "({$tagregexp})" . '(?![\w-])' . '(' . '[^\]\/]*' . '(?:' . '\/(?!\])' . '[^\]\/]*' . ')*?' . ')' . '(?:' . '(\/)' . '\]' . '|' . '\]' . '(?:' . '(' . '[^\[]*+' . '(?:' . '\[(?!\/\2\])' . '[^\[]*+' . ')*+' . ')' . '\[\/\2\]' . ')?' . ')' . '(\]?)';
// 6: Optional second closing bracket for escaping shortcodes: [[tag]].
// phpcs:enable
}