正则表达式捕获视频 wordpress 简码中的变量

regex to catch variables in a video wordpress shortcode

我正在使用正则表达式在 wordpress 的 [video] 短代码中捕获变量。

想象一下不同的简码。一个可能看起来像这样:

[video width="1080" height="1920" mp4="http://path-to-video/20160119_144218.mp4" autoplay="true" webm="http://path-to-video/20160119_144218_1.webm"][/video]

另一个,像这样:

[video width="720" height="1280" mp4="http://path-to-video/VID_20160118_134920.mp4" autoplay="true" poster="http://path-to-image/2016-01-23-16_23_45-Export-Settings-1.jpg"][/video]

我的正则表达式的目的是检索 mp4webm 变量。

问题在于,有时只有 mp4 来源存在;有时两者都存在。 其他信息,如 autoplayposter 可能存在也可能不存在 ,按照 wordpress 喜欢的顺序。

所以我需要一个条件正则表达式,它考虑到了这一点,并且在没有 webm 的情况下也不会失败。

原来我有这个:

\[video .* mp4="(.*?)".*webm="(.*?)"\]\[/video\]

它与 mp4webm 的短代码完美配合(相信 wordpress 会,因为它似乎出于某种原因,总是把 webm 放在最后),但是会webm 不存在时失败。

现在我正在尝试使用条件正则表达式,但没有取得太大的成功。

这是我的:

\[video .* mp4="(.*?)".*(?(?=.*webm=)webm="(.*?)"\]\[/video\]|.*\]\[/video\])

上面给出的两个例子中的 mp4 值都很好:但是在存在 webm 的地方,它会忽略它。

我担心,即使我设法检索到这两个变量,短代码中信息的其他变体也会使我的正则表达式失效。

你能帮我创建一个更好的、万无一失的正则表达式吗???

使用这个正则表达式:

\[video(?:.*?(?:webm|mp4)="([^"]*)")?(?:.*?(?:webm|mp4)="([^"]*)")?.*\]\[\/video\]

工作示例:https://regex101.com/r/tC1aE3/5