Make WordPress Core


Ignore:
Timestamp:
07/02/2019 01:30:15 AM (5 years ago)
Author:
pento
Message:

Clean up stray <p> tags added by wpautop() inside block level tags.

autop() can sometimes get confused and not clean up stray <p> or </p> tags inside block level elements, which produces sub-optimal HTML. While browsers can generally handle it, there's no need to make things harder for them if we don't have to.

Props pento, ayubi, pbearne, jond, azaozz, 1994rstefan, dionysous, MikeHansenMe, jorbin, miqrogroove, niallkennedy.
Fixes #27350.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/formatting.php

    r45580 r45585  
    493493    $pee = preg_replace( '|<br\s*/?>\s*<br\s*/?>|', "\n\n", $pee );
    494494
    495     $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';
     495    $allblocks        = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)\b';
     496    $allblocksexceptp = str_replace( '|p|', '|', $allblocks );
    496497
    497498    // Add a double line break above block-level opening tags.
     
    559560    $pee = preg_replace( '|<p>\s*</p>|', '', $pee );
    560561
     562    // If an opening or closing block element tag is wrapped in a <p>, unwrap it.
     563    $pee = preg_replace( '!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', '$1', $pee );
     564
    561565    // Add a closing <p> inside <div>, <address>, or <form> tag if missing.
    562566    $pee = preg_replace( '!<p>([^<]+)</(div|address|form)>!', '<p>$1</p></$2>', $pee );
    563 
    564     // If an opening or closing block element tag is wrapped in a <p>, unwrap it.
    565     $pee = preg_replace( '!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', '$1', $pee );
    566567
    567568    // In some cases <li> may get wrapped in <p>, fix them.
     
    577578    // If an opening or closing block element tag is followed by a closing <p> tag, remove it.
    578579    $pee = preg_replace( '!(</?' . $allblocks . '[^>]*>)\s*</p>!', '$1', $pee );
     580
     581    // If a closing <p> tag is inside a block element tag, without a preceding opening <p> tag, remove it.
     582    $pee = preg_replace( '#(<(' . $allblocksexceptp . ')[^>]*>)(((?!<p>|</\2>).)*)</p>#s', '$1$3', $pee );
     583
     584    // If an opening <p> tag is inside a block element tag, without a following closing <p> tag, remove it.
     585    $pee = preg_replace( '#<p>(((?!</p>).)*</' . $allblocksexceptp . '>)#s', '$1', $pee );
    579586
    580587    // Optionally insert line breaks.
Note: See TracChangeset for help on using the changeset viewer.