2012-07-20 100 views
3

可能重复:
a simple function for return number from string in phpPHP:最好的方法来从字符串中提取数字

什么是最好/最有效的方法来从字符串中提取一组特定的数字?例如:我希望在案例#之后立即得到一组数字,在sring“blah blah Case#004522 blah blah”中。我想像例子#之后的数字字符总是一样的,但我希望代码不要像以前那样做这个假设。

到目前为止,我一直在使用strpos方法来定位案例#再拉个字符的具体数目后记使用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 2012-07-20 14:19:55

+0

取决于您对“最佳”的定义。你的意思是最快吗?我认为strpos应该是在另一个字符串中查找特定字符串的最快方法,假设将该数字视为以字符串开头(比preg_match快)。 – Rhys 2012-07-20 14:23:39

+0

@Ryven:最佳在该特定情况下是用的preg_match作为阵列中获得可能的多个匹配被一个未考虑奖金。 – Brad 2012-07-20 14:34:55

回答

6

您可以使用正则表达式来首先匹配你的角色(Case#)的图案,然后您希望匹配的数字只(位),也就是在PCRE \dDemo):

$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); 
+0

你不需要'[\ d]'中的'[]''。 – nickb 2012-07-20 14:20:05

+0

是的。固定。谢谢。 – madfriend 2012-07-20 14:21:09

+0

该会发出通告,如果正则表达式不匹配 – 2012-07-20 14:24:32

3

你可以找到它,你做它已经,然后扫描数(Demo):

$find = strpos($text, 'Case#'); 
sscanf(substr($text, $find), 'Case#%d', $numbers); 
+0

这也适用,它非常简单。我更喜欢preg_match的例子的唯一原因是,它返回可能的多个匹配,直到我看到它,没有意识到可以实际发生在我们的场景中。谢谢! – Brad 2012-07-20 14:30:23

+1

是的,如果模式更一般,并且有重复,'preg_match_all'是一个不错的选择。我编辑了另一个答案,并用'preg_match_all'添加了一个例子。 – hakre 2012-07-20 14:33:44

0

最简单的办法是

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