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


Extract numbers (not digits) from a string in PHP

我想从字符串中提取整数(而不仅仅是数字(例如,34681A 林肯街冲浪城 NJ 08008应该只输出 08008,而不是 34681

我试过使用正则表达式

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

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

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

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

'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])),是一个非捕获组,它匹配字符串^的开头或需要从由.,或空格组成的集合中的字符的后视

这与末尾的位几乎相同,(?=[,.'s]|$) ,这是一个非捕获组,由字符串末尾或上述集合中的字符组成。

剩下的就是 'd+它被捕获,因此该程序的输出是:

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

请记住,随着您向组合中添加更多规则,正则表达式可能会变得非常复杂。在某些时候,最好编写自己的解析器,以便您拥有更好的控制和可读性。

(?:^|(?<=[,.'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|.

看这里

$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);
preg_match_all('!'d+!', $str, $matches);
print_r($matches);