当在机器人的帮助下向Telegram发送消息时,使用html格式,这意味着当尝试发送消息时会出现错误,您需要将这些箭头替换为<
和>
,但每次将它们写在一堆文本中都不方便,我想试着做一个定期的,将自动替换这些东西,但不接触有效的html标签,例如:
不需要替换的有效标记的示例
<a href="tg://user?id=1">Bot</a>
字符串
需要替换的无效标记
<argument>
型
下面是我尝试编写的代码,但最终无法正常工作
import re
def replace_invalid_tags(html_string):
invalid_tag_pattern = r'<[^a-zA-Z/!?](.*?)>'
fixed_html = re.sub(invalid_tag_pattern, r'<\1>', html_string)
return fixed_html
html_string = '<a href="#">Link</a> <argument1> <argument2>'
fixed_html = replace_invalid_tags(html_string)
print(fixed_html)
型
1条答案
按热度按时间xzlaal3s1#
我个人建议您使用 Python HTML解析或清理库来完成这项工作。正则表达式很棒,我喜欢它们。但在某些情况下,我更喜欢使用经过良好测试的库,这些库是专门为解决问题而构建的。
我不是一个Python程序员,但主要是一个PHP程序员。在好的CMS项目中,您可以添加一些清理库,如HTMLPurifier并定义规则。
在你的例子中,一些标签应该被转换成HTML实体,以便显示为普通文本,而在其他一些情况下,标签必须保持原样。当然,一些属性和特定的标签也应该被删除(例如:
<img onload="alert('xss attack')"
或<script>alert('bad')</script>
。这是解析器或清理库将做一个更安全的工作。假设允许使用这些标记:
<a>
,具有href
属性。可能不应允许其他属性。通常,我会删除style="font-size: 100px"
。<strong>
和<em>
,不带属性。旧的<b>
和<i>
标签怎么样?我将它们分别转换为<strong>
和<em>
,因为它们可能对可读性有用,但在 Telegram 中不允许。所有其他标签都应该转换为
<var>
(如果允许),内容转换为HTML特殊字符(<
到<
和>
到>
)。如果需要的话,处理其他转换可能是安全的。在Python中,我看到你可以使用html-sanitizer library。
我看到可以定义一些预处理器函数,通常是在需要时转换一些标记。这意味着您可以创建一个函数,将所有未经授权的标记转换为
<var>
或<pre>
标记,并使用找到的标记的转义等效HTML填充其内容。一些预构建的预处理器函数已经存在,例如bold_span_to_strong(),因此有一些示例可以解决您的问题。一个查找无效标签的纯正则表达式解决方案可以这样做:
字符串
示例:https://regex101.com/r/xiZl1n/1
我接受可选的空格,结束标记的斜线,然后使用负向前看,以避免匹配您想要接受的标记。我在valid标签后面添加了-Boundary
\b
,以避免它接受以“a”字符开头的<argument>
。我只想匹配完整的单词。然后你可以决定如何处理你所有的比赛。如果你想直接用
<
替换<
,你可以这样做:https://regex101.com/r/xiZl1n/3的
编辑:句柄
->
、>.<
、=>
等我仍然相信解析器是最好的选择。但是你问是否可以修改正则表达式来处理更多的情况。我个人不认为一个正则表达式可以做到这一点。当然也会不安全。
但正如我所评论的,你可以尝试几个步骤:
1.如果您认为值得,请将
<i>
标记转换为<em>
,将<b>
标记转换为<strong>
。1.找到所有有效的标签,如
<a>
、<strong>
、<em>
,并分别用[a]
、[strong]
和[em]
替换它们。这可以通过以下模式来完成:型
并替换为
[\1\2]
。正在运行:https://regex101.com/r/xiZl1n/4<
替换为<
,将>
替换为>
:<
变为<
:https://regex101.com/r/xiZl1n/5的>
变为>
:https://regex101.com/r/xiZl1n/6型
并替换为
<\1\2\3>
。正在运行:https://regex101.com/r/xiZl1n/8在该步骤中,捕获组n°3包含所有标签属性。这是你可以过滤它,只接受一些特定的,如
href
,id
,title
,但删除所有其他(例如:class
、style
、onclick
)。使
i
标志区分大小写可能很重要。这就是它在 JavaScript 中的样子: