WordPress.org

Make WordPress Core

Ticket #15600: 15600.5.diff

File 15600.5.diff, 6.3 KB (added by mdawaffe, 7 years ago)

back compat

  • 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/s", 'do_shortcode_tag', $content );
    152152}
    153153
    154154/**
     
    159159 *
    160160 * The regular expression contains 6 different sub matches to help with parsing.
    161161 *
    162  * 1/6 - An extra [ or ] to allow for escaping shortcodes with double [[]]
     162 * 1 - An extra [ to allow for escaping shortcodes with double [[]]
    163163 * 2 - The shortcode name
    164164 * 3 - The shortcode argument list
    165165 * 4 - The self closing /
    166166 * 5 - The content of a shortcode when it wraps some content.
     167 * 6 - An extra ] to allow for escaping shortcodes with double [[]]
    167168 *
    168169 * @since 2.5
    169170 * @uses $shortcode_tags
     
    175176        $tagnames = array_keys($shortcode_tags);
    176177        $tagregexp = join( '|', array_map('preg_quote', $tagnames) );
    177178
    178         // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcodes()
    179         return '(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)';
     179        // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()
     180        return
     181                  '\\['                              // Opening bracket
     182                . '(\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
     183                . "($tagregexp)"                     // 2: Shortcode name
     184                . '\\b'                              // Word boundary
     185                . '('                                // 3: Unroll the loop: Inside the opening shortcode tag
     186                .     '[^\\]\'"\\/]*'                // Not a closing bracket, single or double quote, or forward slash
     187                .     '(?:'
     188                .         '(?:'
     189                .             "'[^']*+'"             // Anything in single quotes
     190                .         '|'
     191                .             '"[^"]*+"'             // Anything in double quotes
     192                .         '|'
     193                .             '\\/(?!\\])'           // A forward slash not followed by a closing bracket
     194                .         ')'
     195                .         '[^\\]\'"\\/]*'            // Not a closing bracket, single or double quote, or forward slash
     196                .     ')*?'
     197                . ')'
     198                . '(?:'
     199                .     '(\\/)'                        // 4: Self closing tag ...
     200                .     '\\]'                          // ... and closing bracket
     201                . '|'
     202                .     '\\]'                          // Closing bracket
     203                .     '(?:'
     204                .         '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
     205                .             '[^\\[]*+'             // Not an opening bracket
     206                .             '(?:'
     207                .                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
     208                .                 '[^\\[]*+'         // Not an opening bracket
     209                .             ')*+'
     210                .         ')'
     211                .         '\\[\\/\\2\\]'             // Closing shortcode tag
     212                .     ')?'
     213                . ')'
     214                . '(\\]?)';                          // 6: Optional second closing brocket for escaping shortcodes: [[tag]]
    180215}
    181216
    182217/**
     
    290325
    291326        $pattern = get_shortcode_regex();
    292327
    293         return preg_replace('/'.$pattern.'/s', '$1$6', $content);
     328        return preg_replace_callback( "/$pattern/s", 'strip_shortcode_tag', $content );
    294329}
    295330
     331function strip_shortcode_tag( $m ) {
     332        // allow [[foo]] syntax for escaping a tag
     333        if ( $m[1] == '[' && $m[6] == ']' ) {
     334                return substr($m[0], 1, -1);
     335        }
     336
     337        return $m[1] . $m[6];
     338}
     339
    296340add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()
    297341
    298 ?>
    299  No newline at end of file
     342?>
  • 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                  '/'
     246                . '<p>'                              // Opening paragraph
     247                . '\\s*+'                            // Optional leading whitespace
     248                . '('                                // 1: The shortcode
     249                .     '\\['                          // Opening bracket
     250                .     "($tagregexp)"                 // 2: Shortcode name
     251                .     '\\b'                          // Word boundary
     252                                                     // Unroll the loop: Inside the opening shortcode tag
     253                .     '[^\\]\'"\\/]*'                // Not a closing bracket, single or double quote, or forward slash
     254                .     '(?:'
     255                .         '(?:'
     256                .             "'[^']*+'"             // Anything in single quotes
     257                .         '|'
     258                .             '"[^"]*+"'             // Anything in double quotes
     259                .         '|'
     260                .             '\\/(?!\\])'           // A forward slash not followed by a closing bracket
     261                .         ')'
     262                .         '[^\\]\'"\\/]*'            // Not a closing bracket, single or double quote, or forward slash
     263                .     ')*?'
     264                .     '(?:'
     265                .         '\\/\\]'                   // Self closing tag and closing bracket
     266                .     '|'
     267                .         '\\]'                      // Closing bracket
     268                .         '(?:'                      // Unroll the loop: Optionally, anything between the opening and closing shortcode tags
     269                .             '[^\\[]*+'             // Not an opening bracket
     270                .             '(?:'
     271                .                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
     272                .                 '[^\\[]*+'         // Not an opening bracket
     273                .             ')*+'
     274                .             '\\[\\/\\2\\]'         // Closing shortcode tag
     275                .         ')?'
     276                .     ')'
     277                . ')'
     278                . '\\s*+'                            // optional trailing whitespace
     279                . '<\\/p>'                           // closing paragraph
     280                . '/s';
     281
     282        return preg_replace( $pattern, '$1', $pee );
    245283}
    246284
    247285/**