Php 获取此字符串的最后一个数字

Php 获取此字符串的最后一个数字,php,regex,Php,Regex,首先让我说我不太明白,所以我希望有人能帮助我 我有一个字符串,比如/1/3或者/1/34/2/6,我试图得到最后一个数字/ 一个朋友寄给我这个配方,但它只给了我最后一个/ preg_replace('~^/([0-9]+)(/.*)?$~', '$1', $cat['path']); 其中$cat[path]是我得到的字符串。我应该如何更改此项以提供最终数字而不是斜杠/?您想要的: #/(\d+)$# 分隔符在哪里。这意味着 / a slash, \d+ a sequence

首先让我说我不太明白,所以我希望有人能帮助我

我有一个字符串,比如/1/3或者/1/34/2/6,我试图得到最后一个数字/

一个朋友寄给我这个配方,但它只给了我最后一个/

preg_replace('~^/([0-9]+)(/.*)?$~', '$1', $cat['path']);
其中$cat[path]是我得到的字符串。我应该如何更改此项以提供最终数字而不是斜杠/?

您想要的:

#/(\d+)$#
分隔符在哪里。这意味着

/      a slash,
\d+    a sequence of one or more digits,
$      then the end.
括号表示您希望捕获序列

PHP代码是:

$string = "1/12/26";

if (preg_match('#/(\d+)$#', $string, $results))
{
    $number = $results[1]; // [0] holds the whole string
    print "The last number is $number.";
}
{和}是分隔符-通常的分隔符是/和/或@和@,但如果方便,您可以选择允许转义尽可能少的字符的分隔符; /匹配一个斜杠-如果我们使用了/分隔符,我们将需要用反斜杠转义这个斜杠; \d匹配一个数字-\d*将匹配任意数量的数字,包括没有数字,\d+将匹配任意数量的数字,但至少匹配一个数字; [^\d]*匹配任何非数字的内容;如果您确定字符串结尾之前的最后一个字符除了数字之外,再也不是其他任何字符,那么这可能是可选的; $匹配字符串的结尾-这确保我们看到的是字符串的结尾; 使用/分隔符的等效示例:

preg_match('/\/(\d)[^\d]*$/', $string, $matches);

我不需要使用正则表达式就可以解决这个问题

$parts = explode('/', $input);
$latest_one = array_pop($parts);
$cat['path']是文件系统路径还是URL路径?PHP已经有了处理这些问题的函数

$cat['path'] = '/1/34/2/6';
var_dump(
    basename($cat['path']),
    pathinfo($cat['path'], PATHINFO_BASENAME)
);
有用信息



-1抓取单个字符的计算太多。请对此进行投票。事实上,我认为regexp的计算量可能比简单的标记化还要大。再说一次,如果preg_匹配,也许它允许更简单的错误检查…@MihaiStancu:真的吗?你是认真的吗?Regex远比这糟糕+事实上,如果他使用strrpos&substr,我会同意regex要糟糕得多,因为它们是字符串上的简单循环。但是创建分解元素的数组意味着为数组中的每个节点使用内存分配。数组是一个有序的HashMap,阅读这个概念可以了解它的复杂性。我同意数组是昂贵的,但是regexp代码还能从哪里获取它的输出呢?不管怎样,我尝试在Linux上使用命令行PHP对各种解决方案进行计时,爆炸速度确实更快。@salathe的basename解决方案甚至更快,约为50%。你的和我的速度都慢了相当大的幅度,当输入字符串变得更复杂时,情况就更糟了。你错了。首先,$matches[0]将包含/。您想使用$matches[1]。第二,你只允许一个数字,如果有几个呢?我会将\d改为\d+。@Lindrian first-off匹配将不包含斜杠,而是包含第一组数字。其次,是的,OP的问题让我相信他想要的是最后一个数字,而不是最后一个数字。@sala我尊重你的意见,它们对我很有用,我已经习惯了。对于一个应该知道斜杠是标准的新手来说,斜杠没什么用处,但是既然我在我的文章中解释了斜杠,我认为这没关系ಠ_ಠ 脸,然后随时保持卷曲背带。别让我阻止你!另外,当模式包含斜杠时,我完全支持不使用斜杠作为分隔符,而是括号/大括号对…不,谢谢。这不是品味的问题,而是代码易读性的问题简单明了:你轻率地使用大括号比更常见的选择要花费更多的时间来消化。你为什么关心斜杠?嗯。。。习惯可悲的是,我习惯于被告知会有这个代币,然后是另一个代币,经过一段时间——几周,但有时只是几个小时——我会得到完全不同的东西。这也是if的原因。就性能而言,我的是个坏习惯。有时,我甚至会得到假阴性,假设只有一个数字-123,而没有其他数字?。根据我的经验,好处大于偶尔出现的问题。但是,谢谢你指出这一点,也谢谢@Lindrian的链接。谢谢你。我在查莫工作,所以我搞错了。如何获得第一个和第二个斜杠之间的第一个数字?在这种情况下,您可以使用^/\d+。我私下为您的基本名称命名为“邪恶天才”。谢谢,这只是我今天被标记为邪恶的几次中的一次。>:我提出这个词对吗?使用:strrevintstrrev$cat['path'].@lserni$cat['path']='/10/20/30';/:'basename确实是一个狡猾的伎俩。RegEx方法更通用,但这应该是最快的方法,很可能是使用c级substr。
$cat['path'] = '/1/34/2/6';
var_dump(
    basename($cat['path']),
    pathinfo($cat['path'], PATHINFO_BASENAME)
);