Of the two aspects you mention, htmLawed can address only the second one.
The first, extracting the teaser/intro. part of the article, would depend on what the input is. If it is an entire web-page (equivalently, the URL of the page), how would one separate out, say, the heading/title, any banner, menu items, etc.? If the web-pages one uses are similarly structured, this may not be that difficult and simple regular expression/sub-string-identifying PHP code can be used to pick out the article text.
With the extract available, htmLawed can do almost any specific filtering. At a simple level, one would use the $config parameters 'elements' and 'deny_attribute'. Other parameters, and $spec, can be used for more advanced work. Refer to the documentation to get an idea of what all is possible.
Irrespective of the length of the extract or where the HTML/DOM structure is cut off because of the extraction, htmLawed will ensure the filtered output is proper HTML, with balanced and properly nested tags. So, what is left is to specify elements/attributes to be allowed/denied.
E.g., to ensure there is no conflict for unique IDs or with style on the web-page displaying the filtered extract, one may want to remove attributes 'style', 'class' and 'id' from the extract's HTML markup. For security one would like to remove 'script', and 'object' and 'embed' elements. Full tables may be allowed but not interrupted ones. And, finally, one may want to convert 'h1' to 'h3' header tags to simple 'div' and 'strong'. The filtering code may thus look something like this:
$config['deny_attribute'] = 'class, id, style';
$config['elements'] = '* -embed -object -script';
if(substr_count($in, '<table') != substr_count($in, '</table>')){
$config['elements'] .= '-table';
}
$out = htmLawed($in, $config);
$out = str_replace(
array('<h1', '<h2', '<h3', '</h1>', '</h2>', '</h3>' ),
array('<div><strong>', '<div><strong>', '<div><strong>', '</div></strong>'),
$out;
);