[英]PHP RegEx with or without trailing slashes
我的目标:
要捕获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,但是将斜杠保留在前面的字符串中?
你的.*
默认是贪婪的,所以如果它可以“吃掉”捕获组中的斜线,它就会。
为了使它不贪心,你需要.*?
在你的捕获组中代替.*
所以,你的正则表达式将是:
$regex = "/^.*?instagram\.com\/p\/(.*?)[\/]?$/";
您可以使用它来捕获除组中的尾部斜杠之外的所有字符:
$regex = "/.*?instagram\.com\/p\/([^\/]*)/"
或者,您可以在组中使用非贪婪的量词,您必须指定一个尾部斜杠或字符串的结尾(或其他一些终结符),以便该组捕获您的ID:
$regex = "/.*?instagram\.com\/p\/(.*?)(?:\/|$)/"
也许你可能尝试的东西:
([^\/]+)\/?$
编辑:嗯,你应该提到你需要检查网站,因为你把foo.com
放在你的第一个示例字符串中......(并在之后重新编辑你的问题......)。
您可以使用它来检查网站:
^.*foo\.com.*?([^\/]+)\/?$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.