我有以下正则表达式模式,将youtube视频与我的独特模式 [URL] youtube url [/ URL]
相匹配\[(url|u2b)](http|https):\/\/(m.|www.)?(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})(.*?)\[\/(url|u2b)]
这对于提取YouTube视频ID几乎是万无一失的,但是如果我在同一行上放置两个YouTube视频,则匹配将只有1个而不是2个。该模式试图将其作为一个整体进行匹配。
例如,如果我将两个youtube视频放在不同的行中,如下所示:
[url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url]
[url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url]
它完美无缺。
但是如果我尝试将这两个视频合并到同一行,那么我就遇到了问题,这只会导致一个格式不正确的匹配:
[url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url] [url]https://www.youtube.com/watch?v=L9-Sr8RPty4[/url]
顺便说一句,我在Javascript中用.replace函数做这一切。
谢谢!
答案 0 :(得分:0)
这是因为中间.+
或.*
进行了匿名匹配。
\[(url|u2b)](http|https):\/\/(m\.|www\.)?(?:youtube\.com\/(?:[^\/]+\/(?:(?!\/?\1).)*\/|(?:v|e(?:mbed)?\/|(?:(?!\/?\1).)*[?&]v=)|youtu\.be\/))([^"&?\/ ]{11})(.*?)\[\/(url|u2b)]
我刚刚将中间.+
或.*?
更改为(?:(?!\/?\1).)*
。它在匹配每个字符之前检查条件。条件是,它检查要匹配的字符不会是第一次捕获中出现的字符串的起始字符( /
(可选)或u
)基。