php Regex将视频从自定义输入转换为HTML

qnyhuwrf  于 2023-04-10  发布在  PHP
关注(0)|答案(1)|浏览(177)

我目前正在尝试编写一个过滤器,它将一些简单的输入文本,如 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(..., '"\'')摆脱它,但我很有兴趣看看是否有模式解决方案。

nukf8bse

nukf8bse1#

子程序:

(?(DEFINE)

# Match quote-delimited values

  (?<attr_value_with_delim>
    '(?:\\.|[^'])*'
  |
    "(?:\\.|[^"])*"
  )

# Match non-quote-delimited values

  (?<attr_value_without_delim>[^'"\s[\]]+)

# Match both types

  (?<attr_value>
    \g<attr_value_with_delim>
  |
    \g<attr_value_without_delim>
  )

# Match attr - value pairs in the following forms:
## attr:value
## attr=value
## attr:"value'[]=:"
## attr='value"[]=:'
## attr:"val\"ue"
## attr:'val\'ue'

  (?<attr_with_value>
    \s+[a-zA-Z]+[:=]\g<attr_value>
  )
)

实际匹配模式:

\[\s*                             # Opening bracket followed by optional whitespaces
video                             # Literal 'video'
\g<attr_with_value>*              # 0+ attribute - value pairs
(?:                               #
  \s+                             # Preceding whitespaces
  url[:=]                         # Literal 'url' followed by either ':' or '='
  (?:                             # 
    '\s*(?:\\.|[^'\s])+\s*'       # Single or double quote-delimited,
  |                               # space-surrounded (optional)
    "\s*(?:\\.|[^"\s])+\s*"       # URL that doesn't contain whitespaces
  |                               #
    \g<attr_value_without_delim>  # or a non-quote-delimited value
  )                               #
)                                 #
\g<attr_with_value>*              # 0+ attribute - value pairs
\s*\]                             # Optional whitespaces followed by closing bracket

这个正则表达式匹配一个视频符号,然后可以使用合法和非恶意的方式进一步解析。它证明了,但强烈建议使用正则表达式解析类似HTML的内容。
试试on regex101.com

相关问题