tinymce.full.js
function removeExplorerBrElementsAfterBlocks(html) {
        // Only filter word specific content
        if (!WordFilter.isWordContent(html)) {
          return html;
        }

        // Produce block regexp based on the block elements in schema
        var blockElements = [];

        Tools.each(editor.schema.getBlockElements(), function (block, blockName) {
          blockElements.push(blockName);
        });

        var explorerBlocksRegExp = new RegExp(
          '(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*',
          'g'
        );

        // Remove BR:s from: <BLOCK>X</BLOCK><BR>
        html = Utils.filter(html, [
          [explorerBlocksRegExp, '$1']
        ]);

        // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
        html = Utils.filter(html, [
          [/<br><br>/g, '<BR><BR>'], // Replace multiple BR elements with uppercase BR to keep them intact
          [/<br>/g, ' '],            // Replace single br elements with space since they are word wrap BR:s
          [/<BR><BR>/g, '<br>']      // Replace back the double brs but into a single BR
        ]);

        return html;
      }
function removeExplorerBrElementsAfterBlocks(html) {
        // Only filter word specific content
        if (!WordFilter.isWordContent(html)) {
          return html;
        }

        // Produce block regexp based on the block elements in schema
        var blockElements = [];

        Tools.each(editor.schema.getBlockElements(), function (block, blockName) {
          blockElements.push(blockName);
        });

        var explorerBlocksRegExp = new RegExp(
          '(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*',
          'g'
        );

        // Remove BR:s from: <BLOCK>X</BLOCK><BR>
        html = Utils.filter(html, [
          [explorerBlocksRegExp, '$1']
        ]);

        // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
        html = Utils.filter(html, [
          [/<br><br>/g, '<BR><BR>'], // Replace multiple BR elements with uppercase BR to keep them intact
          [/<br>/g, ' '],            // Replace single br elements with space since they are word wrap BR:s
          [/<BR><BR>/g, '<br>']      // Replace back the double brs but into a single BR
        ]);

        return html;
      }
function removeExplorerBrElementsAfterBlocks ( html ) { // Only filter word specific content if ( ! WordFilter . isWordContent ( html ) ) { return html ; } // Produce block regexp based on the block elements in schema var blockElements = [ ] ; Tools . each ( editor . schema . getBlockElements ( ) , function ( block , blockName ) { blockElements . push ( blockName ) ; } ) ; var explorerBlocksRegExp = new RegExp ( '(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*(<\\/?(' + blockElements . join ( '|' ) + ')[^>]*>)(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*' , 'g' ) ; // Remove BR:s from: <BLOCK>X</BLOCK><BR> html = Utils . filter ( html , [ [ explorerBlocksRegExp , '$1' ] ] ) ; // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break html = Utils . filter ( html , [ [ / <br><br> / g , '<BR><BR>' ] , // Replace multiple BR elements with uppercase BR to keep them intact [ / <br> / g , ' ' ] , // Replace single br elements with space since they are word wrap BR:s [ / <BR><BR> / g , '<br>' ] // Replace back the double brs but into a single BR ] ) ; return html ; }
Removes BR elements after block elements. IE9 has a nasty bug where it puts a BR element after each
block element when pasting from word. This removes those elements.

This:
<p>a</p><br><p>b</p>

Becomes:
<p>a</p><p>b</p>
Removes BR elements after block elements . IE9 has a nasty bug where it puts a BR element after each block element when pasting from word . This removes those elements .