如果你想知道你的正则表达式有什么问题,这里有一个解释:
/^(http|https|://)youtube.com|vimeo.com.*$/
首先要做的是:您需要将 youtube|vimeo 部分封装为一个组(我们将添加?:
到前面,因为我们不想捕获它)。否则它实际上是在寻找(^(http|https|://)youtube.com)|(vimeo.com)
根本不是你想要的。此外,你会想要逃避你的时期,因为那是 dotall 字符(我假设你不希望“youtubescom”匹配),以及你的正斜杠。
现在,我们有:
/^(http|https|:\/\/)(?:youtube\.com|vimeo\.com).*$/
因此,我们在这里检查“ http ”、“ https ”或“ :// ”是否以字符串开头并出现在“ youtube.com ”或“ vimeo.com ”之前。但是,我们真正想要的是检查“ http:// ”、“ https:// ”或只是“ // ”是否出现在任何一个之前:
/^(http:\/\/|https:\/\/|\/\/)(?:youtube\.com|vimeo\.com).*$/
你可以停在那里,这就是你的答案。但是,让我们通过查找冗余继续进行一些清理。首先,我们的两个域都有“ .com ”,所以我们可以简单地制作那个部分(?:youtube|vimeo)\.com
。接下来,我们的协议前缀都有“ // ”,所以我们可以把它拉出来:(http:|https:)\/\/
。但是,现在“ http: ”或“ https: ”必须以字符串开头。因为我们希望这些是可选的,所以我们会在之后添加一个“ ? ”,所以我们得到(http:|https:)?\/\/
. 现在,由于它们非常接近,我们真正想要的只是 ssl 的可选“ s ”。最后,我们终于可以得到:
/^(https?:)?\/\/(?:youtube|vimeo)\.com.*$/