匹配Url中正则表达式的问题

时间:2014-12-19 06:54:40

标签: regex

我使用下面的正则表达式来匹配YouTube网址

(?:http?s?:\/\/)?(?:www\.)?(?:youtu(?:\.be|be\.com)\/(?:.*v(?:\/|=)|(?:.*\/)?)([\w'-]+))

此网址与每个网址匹配,但如果网址是用<p>标记编写的,则该网址与此网址p的最后结束</p>代码http://youtu.be/-wtIMTCHWuI相匹配。

演示html:

<p>Lesson Description, Video testing.</p>

<p> </p>

<p>http://youtu.be/-wtIMTCHWuI</p> 

如果您将上述HTML与上面的正则表达式匹配,则结果为:

http://youtu.be/-wtIMTCHWuI</p

这是错误的,我不希望最后一次关闭</p>

如果我修改正则表达式并在最后编写(?=<),那么它可以正常工作,但它不适用于http://www.youtube.com/v/-wtIMTCHWuI?version=3等其他YouTube网址。它最后只包含?version=3

如果没有(?=<),它将与http://www.youtube.com/v/-wtIMTCHWuI中的http://www.youtube.com/v/-wtIMTCHWuI?version=3匹配,但与(?=<)匹配则不匹配任何内容。

我希望我已正确解释了我的问题。什么是正确的正则表达式将匹配上述网址,并与HTML标记</p>不匹配?

2 个答案:

答案 0 :(得分:1)

只需在最后一个字符类中添加?=符号,您也需要(?:.*\/)?(?:[^<]*\/)?,因为默认情况下.*是贪婪的。也就是说,它会尽可能匹配所有角色。 [^<]*匹配任何字符,但不匹配<,零次或多次。

(?:http?s?:\/\/)?(?:www\.)?(?:youtu(?:\.be|be\.com)\/(?:.*\bv(?:\/|=)|(?:[^<]*\/)?)(?:[\w'?=-]+))

DEMO

答案 1 :(得分:0)

(?:http?s?:\/\/)?(?:www\.)?(?:youtu(?:\.be|be\.com)\/(?:.*v(?:\/|=)|(?:[^<]*\/)?)(?:[\w'-]+))

试试这个。看看演示。

https://regex101.com/r/vN3sH3/20