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

时间:2018-07-11 15:14:25

标签: php moodle

我将数据库查询的值存储在$domains中。每条记录如下:domain_23domain_88domain_0等。

对于每个值,我想在下划线后提取数字并将其存储在名为$dom_id的变量中。我该如何实现?这是我的尝试:

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

3 个答案:

答案 0 :(得分:2)

您可以使用explode

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;
    }
}

就像IncredibleHat正确说的那样,这是针对具有domain_4之类的值的域-不适用于domain_thats_cool_4之类的域-但我们可以像这样使动态性更强:

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

参考:

https://secure.php.net/manual/en/function.explode.php

https://secure.php.net/manual/en/function.end.php

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

foreach ($domains as $domain) {
    if (preg_match('!_(\d+)$!', $domain, $matches)) {
        $dom_id = $matches[1];
    }
}

有趣的是:您可以确保仅匹配字符串末尾下划线之后的数字。

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