给出以下示例字符串
//www.youtube.com/embed/OYb_N_XEYas?rel=0&showinfo=0
//www.youtube.com/embed/STH9ZpeFH2o
我需要在嵌入/'之后捕获子字符串。直到字符串的结尾或者'?'或者' /'字符。
如何指定可选的第二个非捕获组?
使用(embed\/)(.*)
适用于第二个字符串,(embed\/)(.*)(\?|\/)
适用于第一个字符串,但两种情况都不起作用。
答案 0 :(得分:1)
这适用于两者
(embed\/)([^\/?]*)
虽然
.*
匹配任何字符
[^\/?]*
匹配除/和?
以外的所有内容答案 1 :(得分:1)
您可以将negated character类用作
/embed\/[^?\/]*/
[^?\/]
匹配?
或/
*
量词。匹配前置正则表达式零或更多次出现
<强>测试强>
preg_match("/embed\/[^?\/]*/", "//www.youtube.com/embed/OYb_N_XEYas?rel=0&showinfo=0", $matches);
=> Array ( [0] => embed/OYb_N_XEYas )
preg_match("/embed\/[^?\/]*/", "//www.youtube.com/embed/STH9ZpeFH2o", $matches);
=> Array ( [0] => embed/STH9ZpeFH2o )
您也可以尝试在非贪婪的.*?
/embed\/.*?(?=(?:\?|\/|$))/
(?=(?:\?|\/|$))
积极向前看。检查匹配的字符串是否后跟?
或/
或$
,字符串结尾。这是一个断言,不会消耗里面的那些字符。从测试中可以看出,输出不包括?
<强>测试强>
preg_match("/embed\/.*?(?=(?:\?|\/|$))/", "//www.youtube.com/embed/OYb_N_XEYas?rel=0&showinfo=0", $matches);
=> Array ( [0] => embed/OYb_N_XEYas )
答案 2 :(得分:1)
您可以使用此正则表达式:
embed\/([^?\/]*)
简而言之,它会匹配所有不是?
或/
的字符,并将它们放在第1组中。因此,无论是否存在此类字符,它都能正常工作,即它ll适用于两个样本字符串。
请注意,这会捕获一个空字符串,如果您不想要它,只需将+
替换为*
。
我也删除了embed\/
周围的群组,因为我认为没有理由拥有它。