You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式实现自定义视频标签转HTML的问题咨询

自定义视频标签正则优化方案

我正在开发一款文本转HTML的过滤器,核心功能是支持用户插入自定义视频标签。输入文本中的视频标签示例如下:

[video url:"https://www.youtube.com/watch?v=EkluES9Rvak" width=100% ratio='16/9'
autoplay:1 caption:"Lea Verou - Regexplained"]

需求是让标签语法更灵活:属性名与值可通过:或=分隔,值可选单/双引号包裹(用于处理含空格或特殊字符的场景)。针对当前正则存在的两个问题,以下是具体解决方案:

当前正则代码

/(?(DEFINE)
# This sub-routine will match an attribute value with or without the quotes around it.
# If the value isn't quoted then we can't accept spaces, quotes or the closing ] tag.
(?<attr_value_with_delim>(?:(?<delimiter>["']).*?(?:\k<delimiter>)|[^"'=\]\s]+))
)

\[
\s*video\s+
(?=[^\]]*\burl[=:](?<url>\g<attr_value_with_delim>))      # Mandatory URL
(?=[^\]]*\bwidth[=:](?<width>\g<attr_value_with_delim>))? # Optional width
(?=[^\]]*\bratio[=:](?<ratio>\g<attr_value_with_delim>))? # Optional ratio
(?=[^\]]*\bautoplay[=:](?<autoplay>\g<attr_value_with_delim>))? # Optional autoplay
(?=[^\]]*\bcaption[=:](?<title>\g<attr_value_with_delim>))? # Optional caption
[^\]]*
\]/guxs

问题分析与解决

1. 处理属性值中包含]的情况

原正则中,正向预查里的[^\]]*会在遇到]时提前终止匹配,导致属性值内的]无法被正确识别。解决思路是优化带引号值的匹配逻辑,允许引号内包含],同时确保只匹配到对应闭合引号:

  • 对带引号的值,使用(["'])(?:\\\1|(?!\1).)*\1模式,既支持转义的引号,也允许中间出现]。

2. 直接捕获不带引号的属性值

原正则的捕获组会包含引号本身,需要调整子模式,将引号内的内容和不带引号的值分别捕获,直接得到纯净的属性值,无需后续trim处理。

优化后的正则代码

/(?(DEFINE)
    # 匹配带引号的值,捕获引号内的内容(支持转义引号)
    (?<quoted_val>(["'])(?P<quoted_content>(?:\\\1|(?!\1).)*)\1)
    # 匹配不带引号的值,直接捕获内容
    (?<unquoted_val>(?P<unquoted_content>[^\s\]]+))
    # 统一属性值匹配规则:优先匹配带引号,再匹配不带引号
    (?<attr_value>(?&quoted_val)|(?&unquoted_val))
)
\[
\s*video\s+
# 强制匹配URL属性,捕获纯净值
(?=\s*url\s*[=:]\s*(?&attr_value)(?P<url>(?P<quoted_content>|(?P<unquoted_content>))))
# 可选属性,逐一捕获纯净值
(?:\s*width\s*[=:]\s*(?&attr_value)(?P<width>(?P<quoted_content>|(?P<unquoted_content>))))?
(?:\s*ratio\s*[=:]\s*(?&attr_value)(?P<ratio>(?P<quoted_content>|(?P<unquoted_content>))))?
(?:\s*autoplay\s*[=:]\s*(?&attr_value)(?P<autoplay>(?P<quoted_content>|(?P<unquoted_content>))))?
(?:\s*caption\s*[=:]\s*(?&attr_value)(?P<title>(?P<quoted_content>|(?P<unquoted_content>))))?
\s*
\]/guxs

优化点说明

  • 针对带引号的属性值,通过(?:\\\1|(?!\1).)*实现:允许匹配除未转义闭合引号外的任意字符,包括],同时支持转义的引号(比如"video]test"这类场景)。
  • 通过quoted_content和unquoted_content两个命名捕获组,直接获取去掉引号的属性值,无需后续字符串处理。
  • 移除了原正则中[^\]]*的限制,避免提前截断匹配内容。

内容的提问来源于stack exchange,提问作者Patrick Janser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:27:02