While this is a rather old question, I thought I'd share my solution to the problem to help other people who may stumble upon this page on google.
As has been said, it is not permitted to put block elements inside a p-tag. However, in practice, this is not actually entirely true. The actual display value is in fact entirely irrelevant; the only thing that is considered is what the default display value is for the tag, e.g. "block" for divs and "inline" for spans. Changing the display value will still make the browser prematurely close the p-tag.
However, this also works the other way around. You can style a span-tag to behave exactly like a div-tag, but it will still be accepted inside the p environment.
So instead of doing this:
<p>
<div>test</div>
</p>
You can do this:
<p>
<span style="display:block">test</span>
</p>
Just remember that the browser validates the content of the p environment recursively, so even something like this:
<p>
<span style="display:block">
<div>test</div>
</span>
</p>
Will result in the following:
<p>
<span style="display:block"></span>
</p>
<div>test</div>
<p>
</p>
Hopefully this will help someone out there :)