Proper splitting of HTML is very tricky, and not worth doing with regular expressions. If you want HTML, something like DOM text iterator will be useful.
Convert description to text:
$text = html_entities_decode(strip_tags($html),ENT_QUOTES,'UTF-8');
This will take first 200 characters (200 words is a bit too much for a sentence, isn't it?) and then look for end of sentence:
$text = preg_replace('/^(.{200}.*?[.!?]).*$/','\1',$text);
You could change [.!?]
to something more sophisticated, e.g. require space after punctuation or require that there's no punctuation nearby:
(?<![^.!?]{5})[.!?](?=[^.!?]{5})
(?=…)
is positive assertion. (?<!…)
negative assertion that looks behind current position. {5}
means 5 times.
I haven't tested it :)