我正在使用preg_match(PHP版本5.5。*)并希望忽略所有字母[a-zA-Z]和特殊符号,例如$
和-
,仅匹配数字,逗号,点。应匹配6 000
之类的数字之间的空格。一个未跟随其他数字的数字之后的逗号应忽略,例如6,
只匹配6
请注意,这在单个字符串中使用,从不在列表中使用,如下面的示例所示。我使用列表来显示输入和所需的输出,"每行"。
示例输入:
1
1,99
1.99
10
100
5999 dollars
2 USD
$2,99
Our price 2.99
Price: $ 20
200 $
20,-
6 999 USD
期望的输出:
1
1,99
1.99
10
100
5999
2
2,99
2.99
20
200
20
6 999
我已尝试/([0-9.,\s]+)/
,但6 999 USD
的输出变为6
。
我们使用的代码如下所示:
preg_match($regex, $value, $extractions);
array_shift($extractions);
$this->persist($extractions);
答案 0 :(得分:2)
<强>更新强>
如果你有 
而不是空格,你可以做两件事。我建议先做一个str_replace()
:
str_replace(' ', ' ', $number);
另一个选项是同时使用 
组检查[\s,]
:
[\d.](?:[\d.]|(?:[\s,]| )(?=\d))*
示例:强>
preg_match('/[\d.](?:[\d.]|[\s,](?=\d))*/', $number, $matches);
$number = reset($matches);
<强>解释强>
所以我将有效字符(数字,空格,逗号和句号)分为两组:[\d.]
和[\s,]
。数字必须以数字或句点开头($.99
== .99
!= 99
)。然后我们使用重复的非捕获组(?:...)*
来处理我们的交替和前瞻断言。任何时候有一个[\d.]
我们都会与现在的问题进行匹配。否则(|
),它是[\s,]
我们断言它后跟一个数字使用前瞻((?=...)
)。
示例:强>
preg_replace('/\s*[^\d\s,.]+\s*|,(?!\d)/', '', $number);
<强>解释强>
[^\d\s,.]+
将匹配不的1个字符,数字,空格,逗号或句点。我们在任意一侧放置\s*
以获取围绕这些不需要的字符的任何额外空格(例如“我们的价格”)。这不匹配的唯一不需要的字符是尾随逗号。我们使用替换(|
),然后查找逗号,然后确保使用否定前瞻((?!...)
)后面没有数字。