PHP:从字符串中提取数字的最佳方法

3
可能重复:
一个简单的PHP函数,用于从字符串中返回数字 从字符串中提取特定一组数字的最佳/最有效方法是什么?例如:我想要在字符串“blah blah Case#004522 blah blah”中获取紧随Case#之后的数字集。我想象在Case#之后的数字字符数将始终相同,但我希望代码不要做出这种假设,因为我已经这样做了。
到目前为止,我一直在使用strpos方法来定位Case#,然后使用substr拉取特定数量的字符。我觉得这很笨拙。也许preg_match会更有效或简化?
$text = "blah blah Case#004552 blah blah";
$find = strpos($text,'Case#');
if ( $find )
  $numbers = substr($text, $find+5, 6);

1
preg_match('/\d+/', $str, $match); - $match[0] 将包含字符串中第一个连续的数字集合。 - DaveRandom
取决于您对“最佳”的定义。您是指速度最快吗?我相信strpos应该是在另一个字符串中查找特定字符串的最快方法,假设一开始将数字视为字符串(比preg_match更快)。 - Rhys
@Ryven:在这种情况下,使用preg_match最好,因为将可能的多个匹配项放入数组中是一个未考虑到的奖励。 - Brad
4个回答

6
您可以使用正则表达式来匹配字符模式(Case#),然后期望仅匹配数字(数字),即在 PCRE 中使用 \d演示):
$numbers = preg_match("/Case#(\d+)/", $text, $matches)
              ? (int)$matches[1]
              : NULL
    ;
unset($matches);

对于同时匹配多个(整数)结果:

$numbers = preg_match_all("/Case#(\d+)/", $text, $matches)
              ? array_map('intval', $matches[1])
              : NULL
    ;
unset($matches);

[\d]中,您不需要使用[] - nickb
如果正则表达式不匹配,它将发出通知。 - Ross Smith II
我喜欢这个返回可能的多个匹配项数组的事实,因为它非常适合我们的情况。谢谢! - Brad

3
您可以像以前一样找到它,然后扫描数字(演示):
$find = strpos($text, 'Case#');
sscanf(substr($text, $find), 'Case#%d', $numbers);

这个也可以,而且非常简单。我更喜欢 preg_match 的例子的唯一原因是它返回可能的多个匹配项,直到我看到它之前,我还没有意识到在我们的情况下实际上可能会发生这种情况。谢谢! - Brad
1
是的,如果模式更通用且需要重复匹配,preg_match_all 是一个不错的选择。我编辑了另一个答案并添加了一个 preg_match_all 的示例。 - hakre

0

最简单的解决方案是

if (preg_match('/Case#\s*(\d+)/i', $test, $m)) {
    $numbers = $m[1];
}

0

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