Try:
<html><p>((?!</p>).)*</p>
As you don't say what regex variant you are using (please read the posting guidelines in the sticky note at the beginning of this forum) I don't know of the negative lookahead function is supported.
You pattern doesn't work because you are not really representing your requirements accurately in your pattern. What it is doing is locating the "<html><p>" sequence and then stepping forward until it gets to the first "/". It the checks the next part of the text ("b>" in your test case) against the pattern ('</p>') and getting a mismatch. The regex engine then starts to backtrack, releasing a character at a time, each time checking to see if the '</p>' pattern can match. As it can't, the whole match is flagged as a "fail" and so the regex skips forward a character (i.e. over the "<") and tries again. This time it fails immediately ('<html>' doesn't match the text which is now seen as "html><p>..."), and continues to fail as it cannot find the starting sequence anywhere else in the string.
Your requirement is to find the next "</p>" sequence, but your regex pattern looks for the next "/". My pattern does what you say you want - once you have the opening sequence, find the next "</p>" sequence.
Again, depending on the capabilities of your regex variant, you might also be able to use:
<html><p>.*?</p>
but this also has issues with line breaks etc which may nor may not be relevant in your situation.
Susan