带或不带斜杠的PHP正则表达式

4

我的目标:

捕捉URL的最后一部分,无论是否有尾随斜杠,在类似以下URL的字符串中,尾随斜杠不是该字符串的一部分:

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

我的问题:

我尝试的所有方法都只允许在URL末尾添加斜杠,而不能让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\/(.*)[\/]?/";

这会导致斜杠(如果存在)出现在我的字符串内部。
我的问题/简而言之:
如何构建一个正则表达式,不需要斜杠,但保持斜杠不出现在我前面的字符串中?

1
顺便问一下,为什么不使用explode(“/”,$url)?您可以提取数组的最后一个值,这应该是您的目标。 - palerdot
我需要验证它是否是该网站的正确URL。 - grepsedawk
您仍然可以检查尾部斜杠并根据需要附加(或删除)它。 - palerdot
3个回答

9

默认情况下,您的.*是贪婪的,因此如果它可以“吞掉”捕获组中的斜杠,它就会这样做。

为了使其非贪婪,您需要在捕获组中使用.*?代替.*。因此,您的正则表达式将是:

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

似乎非贪心的问号强制我的正则表达式根本无法捕获我的ID。 - grepsedawk
啊,是的,我的错误。我已经编辑添加了起始和结束字符。 - vroomfondel
这似乎是解决这种问题最实用的方法。但是,你把^和$放在了斜杠外面。 - grepsedawk

2
你可以使用以下表达式来匹配除尾部斜杠以外的所有字符:
$regex = "/.*?instagram\.com\/p\/([^\/]*)/"

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

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

2

也许你可以尝试以下方法:

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

在regex101上查看演示

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

您可以使用以下内容来检查网站:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接