带有或不带有斜杠的 PHP RegEx

Posted

技术标签:

【中文标题】带有或不带有斜杠的 PHP RegEx【英文标题】:PHP RegEx with or without trailing slashes 【发布时间】:2013-08-24 07:16:41 【问题描述】:

我的目标:

要捕获 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,但又不让斜杠出现在前面的字符串中?

【问题讨论】:

顺便说一句,为什么不使用 explode ("/", $url) ?您可以提取应该作为目标的数组的最后一个值。 我需要验证它是否也是该网站的正确网址 您仍然可以根据需要检查尾部斜杠并附加(或删除)它。 【参考方案1】:

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

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

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

【讨论】:

似乎非贪婪的问号迫使我的正则表达式根本无法获取我的 ID。 啊,是的,我的错。我已经编辑添加了开始和结束字符。 这似乎是解决此类问题的最实用的解决方案。但是,您确实将 ^ 和 $ 放在了斜线之外。【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

也许你可以尝试一下:

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

Demo on regex101

编辑:嗯,您应该提到您还需要检查该站点,因为您将foo.com 放在您的第一个示例字符串中...(然后重新编辑您的问题...)。

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

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

【讨论】:

以上是关于带有或不带有斜杠的 PHP RegEx的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)

如何将带有斜杠的 URL 重定向到没有斜杠的相应 URL?

如何将带有双反斜杠的字符串转换为单反斜杠

如何将 Spring MVC 控制器映射到带有和不带有斜杠的 uri?

带有斜杠的奇怪 Nginx 行为

带有斜杠的 Flask POST