获取字符串末尾括号内的文本

3

假设我有以下用户列表:

Michael (43)
Peter (1) (143)
Peter (2) (144)
Daniel (12)

最右边括号中的数字是用户编号。

我想循环每个用户并获取列表中最高的用户编号,在这种情况下应该是144。 我该如何做到这一点?我相信可以使用某种正则表达式来实现,但我不知道如何操作。我的循环很简单:

$currentUserNO = 0;

foreach ($users as $user) {
    $userNO = $user->NameUserNo; // NameUserNo is the string to be stripped! ex: "Peter (2) (144)" => 144

    if ($userNO > $currentUserNO) {
        $currentUserNO = $userNO;
    }
}

echo "The next user will be added with the user number: " . $currentUserNO + 1;

你的正则表达式在哪里? - revo
@revo "我相信它可以通过某种正则表达式完成,但是我不知道怎么做。" - scrowler
@scrowler 他可能不知道“如何”去做,但可能有“尝试”的想法! - revo
@revo 这里是 StackOverflow 呀... - i alarmed alien
NameUserNo 最初是如何生成的?答案可能涉及修改用户类,而不是使用某些正则表达式技巧。 - Steve
6个回答

3
您可以使用正则表达式,例如:
/\((\d+)\)$/
          ^ glued to the end of the string
        ^^ closing parentheses
    ^^^ the number you want to capture
 ^^ opening parentheses

要捕获字符串末尾最后一组括号内的数字,可以使用以下基本数组和字符串函数:

但是你也可以使用一些基本的数组和字符串函数:

$parts = explode('(', trim($user->NameUserNo, ' )'));
$number = end($parts);

这可以分解为以下步骤:

  • 从结尾(也可以使用rtrim())删除括号和空格;
  • 根据开放括号将字符串分解为数组;
  • 获取数组中的最后一个元素。

基本的数组技巧已被接受,对正则表达式的解释加分 :) - MicBehrens

1

如果你不熟悉正则表达式,就不应该使用它们(并且开始认真学习它们*,因为它们非常强大但晦涩难懂)。

与此同时,您不必使用正则表达式来解决问题,只需使用以下方法(假设NameUserNo仅包含列表的一行):

$userNO = substr(end(explode('(',$user->NameUserNo;)),0,-1);

我会尽力帮助您进行翻译。以下是需要翻译的内容:

应该更容易理解。

* 有没有一个好的、在线的、交互式的正则表达式教程?


为什么要告诉人们不要使用正则表达式?更加熟悉它们的方法就是使用它们!太多人认为正则表达式很可怕、很奇怪(特别是在 PHP 中,还有一种误解认为它们非常慢),但它们只是程序员工具箱中的另一个工具。 - i alarmed alien
@ialarmedalien 想一想:人们认为正则表达式很可怕,只是因为他们在StackOverflow(或类似的网站)上询问解决当前问题的正则表达式,并将其复制粘贴。这不是学习正则表达式或使它们变得不那么可怕的方法。 - Eineki
@Eineki 这是 SO 的一个普遍问题:人们提出问题,希望填补程序中的某个漏洞,而回答问题的人则发布没有解释的代码。对于前者,几乎无法做什么,但可以通过为解决方案添加说明性文本来对抗后者。我还发现,从 Perl 背景出发,PHP 用户对正则表达式不太熟悉——我在 Perl 中编写的第一段代码就使用了正则表达式进行文件解析!如果更多的 PHP 程序员早些时候接触到正则表达式,它们就不会有这种危险和神秘的氛围了。 - i alarmed alien
@ialarmedalien 在 PHP 中,正则表达式历史上有点混乱。支持两种正则表达式:扩展的 POSIX 正则表达式(ereg),现在已被弃用,以及 Perl 正则表达式(preg)。想象一下一个 PHP 新手,正在为此苦苦挣扎。再加上通常情况下,PHP 新手没有编程经验,这就需要他们通过教程或者更有组织的方式来学习语言。我并不是说他们无法掌握正则表达式,而是要建议他们通过教程或者更有组织的方式来学习语言,而不是只在需要时寻求建议。因此,提供了教程链接。 - Eineki

0

我想这基本上就是你要找的内容:

<?php
$list = array();
foreach $users as $user) {
  preg_match('/$([a-zA-Z]+).*\([1-9]+\)$/', , $tokens);
  $list[$tokens[2]] = $tokens[1];
}
ksort($list);
$highest = last(array_keys($list));

echo "The next user will be added with the user number: " . $highest++;

0

使用正则表达式很容易实现。

foreach ($users as $user) {
    # search for any characters then a number in brackets
    # the match will be in $matches[1]
    preg_match("/.+\((\d+)\)/", $user->NameUserNo, $matches);
    $userNO = $matches[1];
    if ($userNO > $currentUserNO) {
        $currentUserNO = $userNO;
    }
}

由于正则表达式使用贪婪匹配,因此 .+(表示搜索一个或多个字符)会尽可能地获取输入字符串中的内容,直到达到方括号中的数字为止。

0

我认为你要找的正则表达式是:

.+\((\d+)\)$

这段代码应该选择所有字符,直到它到达括号中包含的最后一个数字。

然后,您可以使用以下PHP代码仅提取数字:

$userNO = preg_replace('/.+\((\d+)\)$/', '$1', $user);

我还没有测试过,但是它应该将$userNO设置为43,用于用户Michael,并将其设置为143,用于用户Peter等等。


0

我对PHP还比较新,但你不能用以下代码吗:

$exploded = explode(" ", $user->NameUserNumber);
$userNo = substr(end($exploded), 1,-1);

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