正则表达式\[([^\]]*)\]\(([^)\s]+)(?:\s+"([^"]*)")?\)可准确捕获Markdown链接的文本、URL和可选title;需对三者分别HTML转义,并校验URL协议白名单以防止XSS。

正则表达式解析 Markdown 链接,核心是准确捕获 [文本] 和 (URL) 两部分,并正确构造 <a> 标签。关键在于避免误匹配(如中括号嵌套、括号内含空格或引号)和保持属性安全(如转义 HTML 特殊字符)。
基础链接匹配模式
标准 Markdown 链接格式为 [显示文字](目标地址) 或带 title 的 [显示文字](目标地址 "提示文字")。对应正则应满足:
将 Markdown 格式的回复转换为适合 Telegram 的富文本,避免渲染错误。适用于用户偏好 Markdown 但目标平台为 Telegram 的场景。
- 方括号内匹配非
]字符,支持空格与常见标点,但不跨行 - 圆括号内匹配非
)和首尾空白之外的 URL,允许末尾带可选的双引号 title - 使用非贪婪量词
.*?防止跨多个链接吞掉内容
推荐表达式:[([^]]*)](([^)s]+)(?:s+"([^"]*)")?)
它有三个捕获组:$1 是链接文本,$2 是 URL,$3 是可选 title。
安全替换与 HTML 转义
直接将 $1 或 $2 插入 HTML 可能引发 XSS 或渲染错误,必须提前转义:
- 对链接文本 $1 和 title $3:将
&→&、→ <code><、>→> - 对 URL $2:还需过滤非法协议(如
javascript:),建议只保留http://、https://、mailto:、tel:等白名单协议
例如在 JavaScript 中替换:
text.replace(/[([^]]*)](([^)s]+)(?:s+"([^"]*)")?)/g, (m, txt, url, title) => {<br>
const safeTxt = txt.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');<br>
const safeUrl = url.match(/^https?:///) ? url : '#';<br>
const attrs = title ? ` title="${title.replace(/"/g, '"')}"` : '';<br>
return `<a href="https://www.php.cn/link/82513eee71dec51bc9af7c445ed3add5"${attrs}>${safeTxt}</a>`;<br>
})
处理边界情况
真实文本中常出现干扰结构,需额外防护:
- 链接文本含转义括号(如
[foo(bar)](url)):正则默认不识别反斜杠转义;若需支持,应先预处理,将[、]、(、)替换为占位符,解析完成再还原 - URL 含空格或括号(如
(file name.pdf)):Markdown 规范不允许,但用户可能误写;可放宽匹配为(([^)]*)),再对 $2 做 trim 和 encodeURI 处理 - 连续多个链接或混排强调(如
**[link](url)**):确保粗体/斜体规则在链接之前执行,否则星号会被提前消耗

















