<?php
// your code goes here
$text = '<strong>&foo < FOO<em class="bar">bar</em></strong>';
$document = <<<EOD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://w...content-available-to-author-only...3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://w...content-available-to-author-only...3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>!html</body>
</html>
EOD;
// PHP's \DOMDocument serialization adds straw whitespace in case the markup
// of the wrapping document contains newlines, so ensure to remove all
// newlines before injecting the actual HTML body to process.
$document = strtr($document, array("\n" => '', '!html' => $text));
$dom = new \DOMDocument();
// Ignore warnings during HTML soup loading.
@$dom->loadHTML($document);
$body_node = $dom->getElementsByTagName('body')->item(0);
$html = '';
foreach ($body_node->getElementsByTagName('script') as $node) {
static::escapeCdataElement($node);
}
foreach ($body_node->getElementsByTagName('style') as $node) {
static::escapeCdataElement($node, '/*', '*/');
}
foreach ($body_node->childNodes as $node) {
$html .= $dom->saveXML($node);
}
$text = $html;
$counter = 0;
$maxlength = 5;
foreach ($tokens[0] as $token) {
if (mb_substr($token, 0, 1, 'utf-8') === '<') { $newtext[] = $token;
continue;
}
if ($counter > $maxlength) {
break;
}
$newtext[] = $token;
}
PD9waHAKCi8vIHlvdXIgY29kZSBnb2VzIGhlcmUKJHRleHQgPSAnPHN0cm9uZz4mYW1wO2ZvbyA8IEZPTzxlbSBjbGFzcz0iYmFyIj5iYXI8L2VtPjwvc3Ryb25nPic7CgogICAgJGRvY3VtZW50ID0gPDw8RU9ECjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uMy5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uMy5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPjwvaGVhZD4KPGJvZHk+IWh0bWw8L2JvZHk+CjwvaHRtbD4KRU9EOwogICAgLy8gUEhQJ3MgXERPTURvY3VtZW50IHNlcmlhbGl6YXRpb24gYWRkcyBzdHJhdyB3aGl0ZXNwYWNlIGluIGNhc2UgdGhlIG1hcmt1cAogICAgLy8gb2YgdGhlIHdyYXBwaW5nIGRvY3VtZW50IGNvbnRhaW5zIG5ld2xpbmVzLCBzbyBlbnN1cmUgdG8gcmVtb3ZlIGFsbAogICAgLy8gbmV3bGluZXMgYmVmb3JlIGluamVjdGluZyB0aGUgYWN0dWFsIEhUTUwgYm9keSB0byBwcm9jZXNzLgogICAgJGRvY3VtZW50ID0gc3RydHIoJGRvY3VtZW50LCBhcnJheSgiXG4iID0+ICcnLCAnIWh0bWwnID0+ICR0ZXh0KSk7CgogICAgJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoKTsKICAgIC8vIElnbm9yZSB3YXJuaW5ncyBkdXJpbmcgSFRNTCBzb3VwIGxvYWRpbmcuCiAgICBAJGRvbS0+bG9hZEhUTUwoJGRvY3VtZW50KTsKICAgIAogICAgJGJvZHlfbm9kZSA9ICRkb20tPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JyktPml0ZW0oMCk7CiAgICAkaHRtbCA9ICcnOwoKICAgIGZvcmVhY2ggKCRib2R5X25vZGUtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKSBhcyAkbm9kZSkgewogICAgICBzdGF0aWM6OmVzY2FwZUNkYXRhRWxlbWVudCgkbm9kZSk7CiAgICB9CiAgICBmb3JlYWNoICgkYm9keV9ub2RlLT5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3R5bGUnKSBhcyAkbm9kZSkgewogICAgICBzdGF0aWM6OmVzY2FwZUNkYXRhRWxlbWVudCgkbm9kZSwgJy8qJywgJyovJyk7CiAgICB9CiAgICBmb3JlYWNoICgkYm9keV9ub2RlLT5jaGlsZE5vZGVzIGFzICRub2RlKSB7CiAgICAgICRodG1sIC49ICRkb20tPnNhdmVYTUwoJG5vZGUpOwogICAgfQogICAgCiAgICAkdGV4dCA9ICRodG1sOwoKcHJlZ19tYXRjaF9hbGwoJy88W14+XSsrPnxbXjw+XHNdKysvJywgJHRleHQsICR0b2tlbnMpOwoKcHJpbnRfcigkdG9rZW5zKTsKCiRjb3VudGVyID0gMDsKJG1heGxlbmd0aCA9IDU7CiRuZXd0ZXh0ID0gYXJyYXkoKTsKZm9yZWFjaCAoJHRva2Vuc1swXSBhcyAkdG9rZW4pIHsKCWlmIChtYl9zdWJzdHIoJHRva2VuLCAwLCAxLCAndXRmLTgnKSA9PT0gJzwnKSB7CgkJJG5ld3RleHRbXSA9ICR0b2tlbjsKCQljb250aW51ZTsKCX0KCSRjb3VudGVyICs9IHN0cmxlbihodG1sX2VudGl0eV9kZWNvZGUoJHRva2VuKSk7CglpZiAoJGNvdW50ZXIgPiAkbWF4bGVuZ3RoKSB7CgkJYnJlYWs7Cgl9CgkkbmV3dGV4dFtdID0gJHRva2VuOwp9CiRuZXd0ZXh0ID0gaW1wbG9kZSgnJywgJG5ld3RleHQpOwpwcmludF9yKCR0b2tlbnMpOwpwcmludF9yKCRuZXd0ZXh0KTs=