4

我的目标:

要捕获 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;博士:

如何构建一个不需要斜杠的正则表达式,但又不让斜杠出现在我前面的字符串中?

4

3 回答 3

9

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

为了使它不贪心,你需要.*?.*你的捕获组中的位置。因此,您的正则表达式将是:

$regex = "/^.*?instagram\.com\/p\/(.*?)[\/]?$/";
于 2013-08-21T19:02:24.063 回答
2

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

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

或者,您可以在组中使用非贪婪量词,您必须指定斜杠或字符串的结尾(或其他终止符),以便组捕获您的 id:

$regex = "/.*?instagram\.com\/p\/(.*?)(?:\/|$)/"
于 2013-08-21T19:02:16.890 回答
2

你可能会尝试的东西:

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

正则表达式 101 上的演示

编辑:嗯,你应该提到你也需要检查网站,因为你foo.com输入了你的第一个示例字符串......(然后重新编辑你的问题......)。

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

^.*foo\.com.*?([^\/]+)\/?$
于 2013-08-21T19:06:10.547 回答