There are several possible kinds of whitespace and even more possibilities for "empty" (e.g., is <p><em></em></p> empty? Or not?).
Also consider the possibility of having <p class="para"> or <p id="chief">.
Much depends on where the text comes from. Microsoft Word will output  's in some circumstances (I could and did unremember them -- sorry).
A reasonable possibility for now might be to use a regex such as #<p>(\\s| )*</p>#mis' to match multiple empty lines.
But keep in mind that this kind of requisite tends to rapidly become unreasonable - for example the class part might force you to use #<p[^>]*>(\\s| )*</p>#mis' and so on - so, you might want to start looking into a XML parser instead.
(?>\s|(?R))*
~u', '', html_entity_decode($html));` - this should work if you have correct HTML entities. If not, you will need to replace them "manually" (with a list, perhaps). – Wiktor Stribiżew Jan 27 '16 at 08:20