从PHP中的字符串中提取数字(而不是数字)

时间:2015-03-04 06:21:25

标签: php regex

我想从字符串中提取整数(而不仅仅是数字) 例如,34681A Lincoln Street Surf City NJ 08008 应仅输出08008,而不是34681

我尝试过使用正则表达式

$str = '34681A Lincoln Street Surf City NJ 08008';
$str = preg_replace('/\D/', '', $str);
echo $str;

但它也输出34681,我不需要。

编辑(根据评论):该数字可以包含任意数量的数字,但它应该是一个独立的数字,即没有任何字母或符号(数字可以接受之前的逗号或点)

3 个答案:

答案 0 :(得分:4)

完全由数字组成的单词的正则表达式为:

\b\d+\b

您可以使用它来提取它们。

\b标记表示在任一方向上从单词字符到非单词字符(或字符串的开头/结尾)的零字符过渡。


例如,请参阅以下代码:

$str = 'James 7, Apt 27, 34681A Lincoln St Surf City NJ 08008';
$rc = preg_match_all('/\b\d+\b/', $str, $matches);
echo "Count = $rc\n";
for ($i = 0; $i < $rc; $i++) {
    echo "Item $i is '" . $matches[0][$i] . "'\n";
}

输出:

Count = 3
Item 0 is '7'
Item 1 is '27'
Item 2 is '08008'

现在,这是专门为您的原始问题量身定制的,但如果您有其他要求,则需要调整正则表达式。

例如,根据您的编辑:

  

该数字可以包含任意数量的数字,但它应该是一个独立的数字,即没有任何字母或符号(可以接受数字后的逗号或点)。

正则表达式可以通过前瞻和后瞻来完成,这是现代正则表达式引擎的一个相当高级的工具,按照以下代码:

$str = '7, James 2-A 3, Apt 27, 34681A Lincoln St Surf City NJ 08008';
$rc = preg_match_all('/(?:^|(?<=[,.\s]))\d+(?=[,.\s]|$)/', $str, $matches);
echo "Count = $rc\n";
for ($i = 0; $i < $rc; $i++) {
    echo "Item $i is '" . $matches[0][$i] . "'\n";
}

开头的部分(?:^|(?<=[,.\s]))是一个非捕获组,它匹配字符串^的开头或需要来自.的集合中的字符的lookbehind, ,或空格。

这几乎与最后的位(?=[,.\s]|$)完全相同,\d+是一个非捕获组,由字符串结尾或前面提到的字符组成。

然后剩下的就是Count = 4 Item 0 is '7' Item 1 is '3' Item 2 is '27' Item 3 is '08008' ,其中捕获,因此该程序的输出是:

{{1}}

请记住,当您添加更多规则时,正则表达式会变得非常复杂。在某些时候,编写自己的解析器可能会更好,这样你就可以获得更好的控制和可读性。

答案 1 :(得分:3)

(?:^|(?<=[,.\s]))\d+(?=[,.\s]|$)

您可以使用lookaheads。请参阅演示。

https://regex101.com/r/vD0sJ3/3

$re = "/(?:^|(?<=\\s))\\d+(?=\\s|$)/si";
$str = "34681A Lincoln Street Surf City NJ 08008";

preg_match_all($re, $str, $matches);

或通过替换

(?:^|(?<=[,.\s]))\d+(?=[,.\s]|$)\K|.

See here

$re = "/(?:^|(?<=[,.\\s]))\\d+(?=[,.\\s]|$)\\K|./i";
$str = "James 3, Aptt.27, 34681/A Lincoln St Surf City NJ 08008";
$subst = "";

$result = preg_replace($re, $subst, $str);

答案 2 :(得分:0)

preg_match_all('!\d+!', $str, $matches);
print_r($matches);