WordPress.org

Make WordPress Core

Ticket #15600: 15600.3.diff

File 15600.3.diff, 6.2 KB (added by mdawaffe, 7 years ago)
  • wp-includes/shortcodes.php

     
    148148                return $content;
    149149
    150150        $pattern = get_shortcode_regex();
    151         return preg_replace_callback('/'.$pattern.'/s', 'do_shortcode_tag', $content);
     151        return preg_replace_callback( "/$pattern/sx", 'do_shortcode_tag', $content );
    152152}
    153153
    154154/**
     
    175175        $tagnames = array_keys($shortcode_tags);
    176176        $tagregexp = join( '|', array_map('preg_quote', $tagnames) );
    177177
    178         // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcodes()
    179         return '(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)';
     178        // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()
     179        return "
     180                \\[                              # Opening bracket
     181                (\\[?)                           # 1: Optional second opening bracket for escaping shortcodes: [[tag]]
     182                ( $tagregexp )                   # 2: Shortcode name
     183                \\b                              # Word boundary
     184                (                                # 3: Unroll the loop: Inside the opening shortcode tag
     185                    [^\\]'\"\\/]*                # Not a closing bracket, single or double quote, or forward slash
     186                    (?:
     187                        (?:
     188                            '[^']*+'             # Anything in single quotes
     189                        |
     190                            \"[^\"]*+\"          # Anything in double quotes
     191                        |
     192                            \\/(?!\\])           # A forward slash not followed by a closing bracket
     193                        )
     194                        [^\\]'\"\\/]*            # Not a closing bracket, single or double quote, or forward slash
     195                    )*?
     196                )
     197                (?:
     198                    \\/\\]                       # Self closing tag and closing bracket
     199                |
     200                    \\]                          # Closing bracket
     201                    (?:
     202                        (                        # 4: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
     203                            [^\\[]*+             # Not an opening bracket
     204                            (?:
     205                                \\[(?!\\/\\2\\]) # An opening bracket not followed by the closing shortcode tag
     206                                [^\\[]*+         # Not an opening bracket
     207                            )*+
     208                        )
     209                        \\[\\/\\2\\]             # Closing shortcode tag
     210                    )?
     211                )
     212                (\\]?)                           # 5: Optional second closing brocket for escaping shortcodes: [[tag]]
     213        ";
    180214}
    181215
    182216/**
     
    194228        global $shortcode_tags;
    195229
    196230        // allow [[foo]] syntax for escaping a tag
    197         if ( $m[1] == '[' && $m[6] == ']' ) {
     231        if ( $m[1] == '[' && $m[5] == ']' ) {
    198232                return substr($m[0], 1, -1);
    199233        }
    200234
    201235        $tag = $m[2];
    202236        $attr = shortcode_parse_atts( $m[3] );
    203237
    204         if ( isset( $m[5] ) ) {
     238        if ( isset( $m[4] ) ) {
    205239                // enclosing tag - extra parameter
    206                 return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6];
     240                return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[4], $tag ) . $m[5];
    207241        } else {
    208242                // self-closing tag
    209                 return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, NULL,  $tag ) . $m[6];
     243                return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, NULL,  $tag ) . $m[5];
    210244        }
    211245}
    212246
     
    290324
    291325        $pattern = get_shortcode_regex();
    292326
    293         return preg_replace('/'.$pattern.'/s', '$1$6', $content);
     327        return preg_replace_callback( "/$pattern/sx", 'strip_shortcode_tag', $content );
    294328}
    295329
     330function strip_shortcode_tag( $m ) {
     331        // allow [[foo]] syntax for escaping a tag
     332        if ( $m[1] == '[' && $m[5] == ']' ) {
     333                return substr($m[0], 1, -1);
     334        }
     335
     336        return $m[1] . $m[5];
     337}
     338
    296339add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()
    297340
    298 ?>
    299  No newline at end of file
     341?>
  • wp-includes/formatting.php

     
    232232 * @param string $pee The content.
    233233 * @return string The filtered content.
    234234 */
    235 function shortcode_unautop($pee) {
     235function shortcode_unautop( $pee ) {
    236236        global $shortcode_tags;
    237237
    238         if ( !empty($shortcode_tags) && is_array($shortcode_tags) ) {
    239                 $tagnames = array_keys($shortcode_tags);
    240                 $tagregexp = join( '|', array_map('preg_quote', $tagnames) );
    241                 $pee = preg_replace('/<p>\\s*?(\\[(' . $tagregexp . ')\\b.*?\\/?\\](?:.+?\\[\\/\\2\\])?)\\s*<\\/p>/s', '$1', $pee);
     238        if ( empty( $shortcode_tags ) || !is_array( $shortcode_tags ) ) {
     239                return $pee;
    242240        }
    243241
    244         return $pee;
     242        $tagregexp = join( '|', array_map( 'preg_quote', array_keys( $shortcode_tags ) ) );
     243
     244        $pattern = "/
     245                <p>                              # Opening paragraph
     246                \\s*+                            # Optional leading whitespace
     247                (                                # 1: The shortcode
     248                    \\[                          # Opening bracket
     249                    ( $tagregexp )               # 2: Shortcode name
     250                    \\b                          # Word boundary
     251                                                 # Unroll the loop: Inside the opening shortcode tag
     252                    [^\\]'\"\\/]*                # Not a closing bracket, single or double quote, or forward slash
     253                    (?:
     254                        (?:
     255                            '[^']*+'             # Anything in single quotes
     256                        |
     257                            \"[^\"]*+\"          # Anything in double quotes
     258                        |
     259                            \\/(?!\\])           # A forward slash not followed by a closing bracket
     260                        )
     261                        [^\\]'\"\\/]*            # Not a closing bracket, single or double quote, or forward slash
     262                    )*?
     263                    (?:
     264                        \\/\\]                   # Self closing tag and closing bracket
     265                    |
     266                        \\]                      # Closing bracket
     267                        (?:                      # Unroll the loop: Optionally, anything between the opening and closing shortcode tags
     268                            [^\\[]*+             # Not an opening bracket
     269                            (?:
     270                                \\[(?!\\/\\2\\]) # An opening bracket not followed by the closing shortcode tag
     271                                [^\\[]*+         # Not an opening bracket
     272                            )*+
     273                            \\[\\/\\2\\]         # Closing shortcode tag
     274                        )?
     275                    )
     276                )
     277                \\s*+                            # optional trailing whitespace
     278                <\\/p>                           # closing paragraph
     279        /sx";
     280
     281        return preg_replace( $pattern, '$1', $pee );
    245282}
    246283
    247284/**