带有或不带尾部斜杠的PHP RegEx

时间:2013-08-21 18:58:11

标签: php regex preg-match-all

我的目标:

捕获URL的最后一部分是否存在尾部斜杠,而不是尾部斜杠是URL上类似于以下内容的字符串的一部分:

http://foo.com/p/dPWjiVtX-C/
                 ^^^^^^^^^^
               The string I want

我的问题:

我尝试的每一种方式只允许使用尾部斜杠而不是没有尾部斜杠的url,或者使尾部斜杠包含在我想要的字符串中。

我尝试了什么?

1 我尝试在结尾处添加斜杠:

  $regex = "/.*?foo\.com\/p\/(.*)\//";
  if ($c=preg_match_all ($regex, $url, $matches))
  {
    $id=$matches[1][0];
    print "ID: $id \n";
  }

如果没有尾部斜杠,则会导致错误。

2 我尝试添加问号:

  $regex = "/.*?foo\.com\/p\/(.*)[\/]?/";

这会导致斜杠(如果存在)位于我的字符串中。

我的问题/ tl;博士:

如何构建一个不需要斜杠的RegEx,但是将斜杠保留在前面的字符串之外?

3 个答案:

答案 0 :(得分:9)

默认情况下你的.*是贪婪的,所以如果它可以“吃掉”捕获组中的斜线,它就会。

为了使其不贪婪,您需要.*?代替捕获组中的.*。所以,你的正则表达式将是:

$regex = "/^.*?instagram\.com\/p\/(.*?)[\/]?$/";

答案 1 :(得分:2)

您可以使用它来捕获除组中的尾部斜杠之外的所有字符:

$regex = "/.*?instagram\.com\/p\/([^\/]*)/"

或者,您可以在组中使用非贪婪量词,您必须指定一个尾部斜杠或字符串的结尾(或其他一些终结符),以便该组捕获您的ID:< / p>

$regex = "/.*?instagram\.com\/p\/(.*?)(?:\/|$)/"

答案 2 :(得分:2)

你可能会尝试的东西:

([^\/]+)\/?$

Demo on regex101

编辑:嗯,你应该提到你需要检查网站,因为你把foo.com放在你的第一个示例字符串中......(并在之后重新编辑你的问题......)。

您可以使用它来检查网站:

^.*foo\.com.*?([^\/]+)\/?$