我使用下面的正则表达式来匹配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>
不匹配?
答案 0 :(得分:1)
只需在最后一个字符类中添加?
和=
符号,您也需要(?:.*\/)?
到(?:[^<]*\/)?
,因为默认情况下.*
是贪婪的。也就是说,它会尽可能匹配所有角色。 [^<]*
匹配任何字符,但不匹配<
,零次或多次。
(?:http?s?:\/\/)?(?:www\.)?(?:youtu(?:\.be|be\.com)\/(?:.*\bv(?:\/|=)|(?:[^<]*\/)?)(?:[\w'?=-]+))
答案 1 :(得分:0)
(?:http?s?:\/\/)?(?:www\.)?(?:youtu(?:\.be|be\.com)\/(?:.*v(?:\/|=)|(?:[^<]*\/)?)(?:[\w'-]+))
试试这个。看看演示。