正则表达式preg_match中和价格表,只保留数字,点和逗号*

时间:2014-05-28 20:12:30

标签: regex preg-match

我正在使用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);

Demo

1 个答案:

答案 0 :(得分:2)

<强>更新

如果你有&#160;而不是空格,你可以做两件事。我建议先做一个str_replace()

str_replace('&#160;', ' ', $number);

另一个选项是同时使用&#160;组检查[\s,]

[\d.](?:[\d.]|(?:[\s,]|&#160;)(?=\d))*

示例:

preg_match('/[\d.](?:[\d.]|[\s,](?=\d))*/', $number, $matches);
$number = reset($matches);

<强>解释

所以我将有效字符(数字,空格,逗号和句号)分为两组:[\d.][\s,]。数字必须以数字或句点开头($.99 == .99!= 99)。然后我们使用重复的非捕获组(?:...)*来处理我们的交替和前瞻断言。任何时候有一个[\d.]我们都会与现在的问题进行匹配。否则(|),它是[\s,]我们断言它后跟一个数字使用前瞻((?=...))。

Demo


示例:

preg_replace('/\s*[^\d\s,.]+\s*|,(?!\d)/', '', $number);

<强>解释

[^\d\s,.]+将匹配的1个字符,数字,空格,逗号或句点。我们在任意一侧放置\s*以获取围绕这些不需要的字符的任何额外空格(例如“我们的价格”)。这不匹配的唯一不需要的字符是尾随逗号。我们使用替换(|),然后查找逗号,然后确保使用否定前瞻((?!...))后面没有数字。

Demo