用于匹配子字符串的可选非捕获组

时间:2015-01-16 06:48:44

标签: php regex

给出以下示例字符串

//www.youtube.com/embed/OYb_N_XEYas?rel=0&showinfo=0
//www.youtube.com/embed/STH9ZpeFH2o

我需要在嵌入/'之后捕获子字符串。直到字符串的结尾或者'?'或者' /'字符。

如何指定可选的第二个非捕获组?

使用(embed\/)(.*)适用于第二个字符串,(embed\/)(.*)(\?|\/)适用于第一个字符串,但两种情况都不起作用。

3 个答案:

答案 0 :(得分:1)

这适用于两者

(embed\/)([^\/?]*)

虽然

.*

匹配任何字符

[^\/?]*

匹配除/和?

以外的所有内容

答案 1 :(得分:1)

您可以将negated character类用作

/embed\/[^?\/]*/
  • [^?\/]匹配?/

  • 以外的任何内容
  • *量词。匹配前置正则表达式零或更多次出现

Regex Demo

<强>测试

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\/.*?(?=(?:\?|\/|$))/
  • (?=(?:\?|\/|$))积极向前看。检查匹配的字符串是否后跟?/$,字符串结尾。这是一个断言,不会消耗里面的那些字符。从测试中可以看出,输出不包括?

Regex Demo

<强>测试

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\/周围的群组,因为我认为没有理由拥有它。