Вы сказали:
Для телеграм API будут работать эти тэги <br><span class="users_list">'.$users_list.'</span>
Нет, теги HTML такие как <br> и <span> не будут корректно работать в Telegram API, если вы отправляете сообщение через бота в обычном текстовом формате или с режимом разметки Markdown или HTML, но не поддерживающим произвольный HTML.
Когда вы отправляете сообщение через Telegram Bot API (например, через метод sendMessage), вы можете указать параметр parse_mode, который определяет, как будет интерпретироваться текст. Telegram поддерживает два основных режима разметки:
Markdown / MarkdownV2
HTML
Но даже в режиме HTML поддерживается лишь ограниченный набор HTML-тегов.
Список допустимых тегов в HTML-режиме Telegram API:
| Тег | Назначение |
|---|---|
<b>, <strong> | Жирный текст |
<i>, <em> | Курсив |
<u> | Подчёркнутый |
<s>, <strike>, <del> | Зачёркнутый |
<span class="tg-spoiler"> | Спойлер |
<a href="..."> | Ссылка |
<code> | Моноширинный текст |
<pre> | Блок кода |
<br> и <span>?<br> — не поддерживается Telegram API. Для переноса строки используйте символ новой строки (\n).
<span> с классами, как <span class="users_list"> — не работает, так как Telegram игнорирует произвольные стили и классы.
Если ты хочешь, чтобы в сообщении был список пользователей, лучше сделать так:
php$message = "Список пользователей:\n" . $users_list;
А если ты хочешь выделить users_list, можешь использовать жирный текст:
php$message = "Список пользователей:\n<b>$users_list</b>";
И передать это в Telegram API с parse_mode = HTML:
php$response = file_get_contents("https://api.telegram.org/bot<token>/sendMessage?" . http_build_query([
'chat_id' => $chat_id,
'text' => $message,
'parse_mode' => 'HTML'
]));
❌ <br> — не работает, заменяй на \n
❌ <span class="..."> — не работает
✅ Используй parse_mode = HTML и допустимые теги (<b>, <i>, <u>, <a>, <code>, и т.д.)
Если покажешь, как ты формируешь $users_list, могу подсказать, как лучше оформить его для Telegram.
Чтобы очистить HTML-текст и оставить только разрешённые Telegram API теги, можно воспользоваться функцией strip_tags() в PHP — но с ограничением: по умолчанию она просто убирает все теги, кроме указанных.
Вот пример кода, который удалит все теги, кроме разрешённых Telegram-HTML тегов:
phpfunction cleanTelegramHtml($text) {
// Разрешённые теги Telegram API (в режиме HTML)
$allowed_tags = '<b><strong><i><em><u><s><strike><del><code><pre><a><span>';
// Оставляем только разрешённые теги
$clean = strip_tags($text, $allowed_tags);
// Очищаем атрибуты у всех тегов, кроме нужных (например, href в <a> и class="tg-spoiler" в <span>)
// Удаляем все атрибуты, кроме разрешённых
// Важно: можно использовать preg_replace с осторожностью
// Оставляем href в <a> и class="tg-spoiler" в <span>, всё остальное убираем
$clean = preg_replace_callback('/<(a|span)\s+([^>]+)>/i', function ($matches) {
$tag = strtolower($matches[1]);
$attrs = $matches[2];
if ($tag === 'a') {
if (preg_match('/href=["\'](.*?)["\']/', $attrs, $href_match)) {
return '<a href="' . htmlspecialchars($href_match[1]) . '">';
}
} elseif ($tag === 'span') {
if (preg_match('/class=["\']tg-spoiler["\']/', $attrs)) {
return '<span class="tg-spoiler">';
}
}
return "<$tag>"; // Возвращаем без атрибутов
}, $clean);
// Закрывающие теги остаются без изменений
return $clean;
}
php$raw_text = '<div><b>Привет</b> <span class="users_list">User1</span> <a href="https://example.com" onclick="alert(1)">Ссылка</a> <script>alert("x")
A network error occurred. Please check your connection and try again. If this issue persists please contact us through our help center at help.openai.com.