使用strpos定位特定子字符串并存储以下内容(PHP)

使用strpos定位特定子字符串并存储以下内容(PHP),php,moodle,Php,Moodle,我将数据库查询的值存储在$domains中。每个记录都是这样的:domain\u 23,domain\u 88,domain\u 0等等 对于每个值,我希望提取下划线后面的数字,并将其存储在名为$dom\u id的变量中。我怎样才能做到这一点?以下是我的尝试: foreach($domains as $domain) { if (strpos($domain, "_")) { $domain = $dom_id; } } 您可以使用分解: fore

我将数据库查询的值存储在
$domains
中。每个记录都是这样的:
domain\u 23
domain\u 88
domain\u 0
等等

对于每个值,我希望提取下划线后面的数字,并将其存储在名为
$dom\u id
的变量中。我怎样才能做到这一点?以下是我的尝试:

foreach($domains as $domain)
{       
    if (strpos($domain, "_")) {
        $domain = $dom_id;
    }
}

您可以使用
分解

foreach ($domains as $domain)
{
    if (strpos($domain, '_')) {
        $domainArr = explode('_', $domain);
        $domainNum = $domainArr[1]; # should output number

        # and if you want it as an int
        $domainNum = (int) $domainNum;
    }
}
正如难以置信的话所说,这适用于具有值的域,如
domain\u 4
-这对像
domain\u这样的值不起作用,因为它很酷\u 4
-但我们可以这样使其更具动态性:

$domainNum = end($domainArr); # should output number
参考:


您还可以存储从
strpos
返回的偏移量,然后使用
substr

foreach ($domains as $domain) {
  if (($offset = strpos($domain, '_')) && $offset !== false) {
    $dom_id = substr($domain, $offset);
  }
}

我喜欢为此使用正则表达式:

foreach ($domains as $domain) {
    if (preg_match('!_(\d+)$!', $domain, $matches)) {
        $dom_id = $matches[1];
    }
}
这样做的好处是:可以确保只匹配字符串末尾下划线后的数字


另一方面,正则表达式非常密集,并非每个程序员都熟悉它们,因此您的里程可能会有所不同。

这里唯一的危险是。。。如果出于某种原因,第一部分有超过1个下划线(他的示例非常基本)。比如他的域名是:
\u tcp.gmail.com\u 88
等等,感谢你的建议。所有域都将遵循相同的格式,只有一个下划线,因此没有理由考虑不同的场景。我收到以下错误:PHP警告:strps()要求参数1为字符串,对象given@D0uble0然后,$domain是一个对象,在循环中打印($domain)以查看与刚才删除的问题相关的数据,您可能需要查看此问题和接受的答案。。。