@sgidlev

Как правильно подготовить html сообщение для отправки в чат Телеграма?

Приветствую, всех.

Подскажите способ или готовую библиотеку для подготовки 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>", "&lt;br&gt;", "</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;
    }
  • Вопрос задан
  • 237 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы