我目前正在尝试编写一个过滤器,它将一些简单的输入文本,如 Markdown 或纯文本转换为一些HTML。这个想法是为了给予最终用户能够将一些视频添加到内容中。因此,输入可以包含简单的 Markdown,然后是一些标签,看起来像这样:
[video url:"https://www.youtube.com/watch?v=EkluES9Rvak" width=100% ratio='16/9'
autoplay:1 caption:"Lea Verou - Regexplained"]
我想在语法上更柔和一些,在属性名和值之间允许:
或=
。像HTML一样,值可以选择单引号或双引号来解决空格或特殊字符的问题。这就是我开始挣扎的地方!
现在,我用PHP写了这个正则表达式:
/(?(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
你可以在这里测试:https://regex101.com/r/hVsav8/1
捕获了可选的属性值,这样我就不需要第二次重新解析匹配的标记。
我的问题:
- 如何处理属性值中的
]
问题? - 是否有可能在没有引号的情况下捕获值?
这不是很重要,因为我可以稍后在回调中使用trim(..., '"\'')
摆脱它,但我很有兴趣看看是否有模式解决方案。
1条答案
按热度按时间nukf8bse1#
子程序:
实际匹配模式:
这个正则表达式匹配一个视频符号,然后可以使用合法和非恶意的方式进一步解析。它证明了,但强烈建议使用正则表达式解析类似HTML的内容。
试试on regex101.com。