WordPress.org

Make WordPress Core

Ticket #10082: 10082.diff

File 10082.diff, 2.0 KB (added by Denis-de-Bernardy, 9 years ago)
  • wp-includes/shortcodes.php

     
    175175        $tagnames = array_keys($shortcode_tags);
    176176        $tagregexp = join( '|', array_map('preg_quote', $tagnames) );
    177177
    178         return '(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)';
     178        return '(\[?)'                                                                          // possibly escape shortcode, part 1
     179                . "\[($tagregexp)\b"                                                    // a valid shortcode, e.g. [foo
     180                        . '(.*?)'                                                                       // maybe attributes
     181                        . '(\/)?'                                                                       // mark self-closing shortcode with a /
     182                        . '\]'
     183                . '('
     184                        . '?(4)'                                                                        // stop if the shortcode is self-closing
     185                . '|'
     186                        . '(?:'
     187                                . "((?:(?!\[(?:$tagregexp)\b).)+?)"             // look-ahead to make the shortcodes non-greedy
     188                                . '\[\/\2\]'                                                    // stop on [/foo]
     189                        . ')?'
     190                . ')?'                                                                                  // allow for [foo] to be treated as [foo/]
     191                . '(\]?)';                                                                              // possibly escape shortcode, part 2
    179192}
    180193
    181194/**
     
    191204 */
    192205function do_shortcode_tag($m) {
    193206        global $shortcode_tags;
    194 
    195         // allow [[foo]] syntax for escaping a tag
    196         if ($m[1] == '[' && $m[6] == ']') {
    197                 return substr($m[0], 1, -1);
     207       
     208        $return = array_shift($m);
     209        $begin = array_shift($m);
     210        $end = array_pop($m);
     211       
     212        // allow [[foo]] and [[foo]bar[/foo]] syntax for escaping a tag
     213        if ($begin == '[' && $end == ']') {
     214                return substr($return, 1, -1);
    198215        }
    199216
    200         $tag = $m[2];
    201         $attr = shortcode_parse_atts($m[3]);
     217        $tag = array_shift($m);
     218        $attr = array_shift($m);
     219        $content = array_pop($m);
     220       
     221        $attr = shortcode_parse_atts($attr);
    202222
    203         if ( isset($m[5]) ) {
     223        if ( $content ) {
    204224                // enclosing tag - extra parameter
    205                 return $m[1] . call_user_func($shortcode_tags[$tag], $attr, $m[5], $m[2]) . $m[6];
     225                return $begin . call_user_func($shortcode_tags[$tag], $attr, $content, $tag) . $end;
    206226        } else {
    207227                // self-closing tag
    208                 return $m[1] . call_user_func($shortcode_tags[$tag], $attr, NULL, $m[2]) . $m[6];
     228                return $begin . call_user_func($shortcode_tags[$tag], $attr, NULL, $tag) . $end;
    209229        }
    210230}
    211231