要处理不同单位的字体大小(例如 pt
, em
, %
等),我们可以扩展正则表达式以匹配这些单位,并在替换函数中相应地处理它们。下面是一个修改后的版本,可以处理多种字体大小单位:
import re
def update_font_sizes_with_regex(html_content, min_font_size=45):
# 正则表达式匹配 font-size 样式,支持 px, pt, em, % 等单位
pattern = re.compile(r'font-size:\s*(\d+(\.\d+)?)\s*(px|pt|em|%|rem|vw|vh|in|cm|mm|ex|ch|pc|q|in|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx|?)')
# 转换函数,将非 px 单位转换为 px(这里简化处理,仅作示例)
# 注意:这个转换是非常简化的,实际转换需要更复杂的逻辑
def convert_to_px(size, unit):
# 这里为了示例,仅简单处理 px 和 em(假设 1em = 16px)
if unit == 'px':
return size
elif unit == 'em':
# 假设基础字体大小为 16px(这通常是一个浏览器的默认值)
return size * 16
# 对于其他单位,这里简单地返回原始值(不进行转换)
# 实际使用时,应该添加适当的转换逻辑
return size
# 替换函数
def replace_font_size(match):
size_str = match.group(1)
unit = match.group(3)
size = float(size_str) # 提取当前字体大小
# 转换为 px 单位的等效值(这里仅作示例,实际可能需要更复杂的逻辑)
px_size = convert_to_px(size, unit)
# 如果转换后的 px 大小小于 min_font_size,则使用 min_font_size px
if px_size < min_font_size:
return f'font-size: {min_font_size}px'
# 如果单位是 px,直接返回原值(因为已经是 px 并且可能经过了四舍五入)
# 对于其他单位,我们返回转换后的 px 值(但这里为了保持原样,还是返回原单位)
# 注意:这里的逻辑可以根据实际需求调整,比如是否总是返回 px 单位
return f'font-size: {size_str}{unit}' if unit != 'px' else f'font-size: {round(px_size)}px'
# 使用正则表达式替换所有匹配的 font-size
updated_html = pattern.sub(replace_font_size, html_content)
return updated_html
# 示例使用
html_content = '<div style="font-size: 12px;">Small Text</div><div style="font-size: 1em;">Em Text</div>'
updated_html = update_font_sizes_with_regex(html_content, min_font_size=45)
print(updated_html)
注意:
convert_to_px
函数中的单位转换是非常简化的,仅用于示例。在实际应用中,单位转换可能更加复杂,并且需要更多的上下文信息(如基础字体大小、视口尺寸等)。- 示例中的
replace_font_size
函数在转换后仍然保留了原始单位(除了px
),这仅是为了演示。在实际应用中,你可能希望统一返回px
单位,或者根据具体需求进行其他处理。 - 正则表达式中的单位列表可能不完整,你可以根据需要添加更多的 CSS 单位。