Приветствую, всех.
Подскажите способ или готовую библиотеку для подготовки html сообщения, чтобы затем отправить его в чат Телеграма.
html верстка может содержать вложенные теги, списки, изображения и т.д.
Проблема в том, что Апи Телеграма поддерживает не все теги, а хочется, чтобы список выглядел списком, ненужные и вложенные теги удалялись и т.д.
Пока сделал вот так, через парсинг содержимого, но мне кажется есть способ получше или опять же существует библиотека с готовым методом.
/**
* @return string
*/
public function getTelegramUserMessage()
{
$message = $this->getNotifyTitleUser();
$doc = new \DOMDocument();
$content_utf = mb_convert_encoding($message, 'HTML-ENTITIES', 'UTF-8'); // correct parsing of utf-8 chars
$doc->loadHTML($content_utf);
$hrefTags = $doc->getElementsByTagName('a');
for ($index = 0; $index < $hrefTags->length; $index++) {
$aTag = $hrefTags->item($index);
$aTag->nodeValue = strip_tags($aTag->textContent);
}
$checkRegularTags = ['p','h1','h2','h3','h4'];
foreach ($checkRegularTags as $checkTag) {
$tags = $doc->getElementsByTagName($checkTag);
if ($tags->length) {
for ($index = 0; $index < $tags->length; $index++) {
$tag = $tags->item($index);
$tag->nodeValue = $this->prepareTelegramString($tag);
}
}
}
$ulTags = $doc->getElementsByTagName('ul');
for ($index = 0; $index < $ulTags->length; $index++) {
$liTags = $ulTags->item($index)->getElementsByTagName('li');
foreach ($liTags as $liCount => $li) {
$li->nodeValue = "— " . $this->prepareTelegramString($li);
}
}
$olTags = $doc->getElementsByTagName('ol');
for ($index = 0; $index < $olTags->length; $index++) {
$liTags = $olTags->item($index)->getElementsByTagName('li');
foreach ($liTags as $liCount => $li) {
$li->nodeValue = $liCount + 1 . ". " . $this->prepareTelegramString($li);
}
}
$message = $doc->saveHTML();
$message = str_replace(array("</li>", "<br>", "<br>", "</ul>", "</ol>"), "\r\n", $message);
$message = str_replace(array("</h1>", "</h2>", "</h3>", "</h4>", "</p>"), "\r\n\r\n", $message);
$message = strip_tags(html_entity_decode($message),
'<b></b><strong></strong><i></i><em></em><a></a><code></code><pre></pre>');
return $message;
}