我怎样才能找到字符串中包含的所有数字,除了那些也包含字母的数字(如A1)? 例如在字符串“saddfs 2300 dfsfd 45 A3 A6”中我只想得到2300和45。
我知道
preg_match_all('!\d+!', $string, $nums);
可以找到所有数字,但我也不想从A3,A6中找到数字。
谢谢!
答案 0 :(得分:2)
只使用字边界或字符串边界:
preg_match_all('!(^|\b)\d+(\b|$)!', $string, $nums);
一些测试:
php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6', $nums);
php > print_r($nums[0]);
Array
(
[0] => 2300
[1] => 45
)
php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6 123', $nums);
php > print_r($nums[0]);
Array
(
[0] => 2300
[1] => 45
[2] => 123
)
php > preg_match_all('!(^|\b)[0-9]+(\b|$)!', '789 saddfs 2300 dfsfd 45 A3 A6 123', $nums);
php > print_r($nums[0]);
Array
(
[0] => 789
[1] => 2300
[2] => 45
[3] => 123
)
根据Zsolt Szilagy的建议, 更新:将\d
更改为[0-9]
。
答案 1 :(得分:2)
非强健,快速和肮脏 - 错误 - 解决方案:
$ php -a
Interactive shell
php > preg_match_all('/\W\d+\W/', 'saddfs 2300 dfsfd 45 A3 A6', $matches);
php > print_r($matches);
Array
(
[0] => Array
(
[0] => 2300
[1] => 45
)
)
更新每个Aleks G的建议,列出了这个解决方案的陷阱:
第一个问题:这在字符串的严格开头或结尾处无法匹配纯数字。要做到这一点,请遵循Aleks G模式,它将锚点角色放在捕获子模式中:
preg_match_all('/(^|\W)\d+(\W|$)/', '2300 df A6 242 sfd 45', $matches);
您可以使模式非捕获('/(?:^|\W)\d+(?:\W|$)/'
)来表示您的意图是括号用于分组而不是用于捕获 - 但这纯粹是可选的,因为您仍然想要的值保留在{{1 }}
第二个问题:\ b和\ W不是完全相同的事情。 \ b是“单词边界”,而\ W是“不是单词字符”。比较Aleks G和我的答案的结果,你会看到\ b给出纯数字,而\ W给出了回到周围的空间。
更新每个Zsolt Szilagy评论,\ d匹配当前字符集中的数字,因此对于具有更多数字字符(例如中文)的语言,您将无法获得预期的0到9。使用字符类[0-9]。