Php Preg_Replace不匹配字符数量

时间:2013-01-22 21:35:48

标签: php preg-replace digits quantifiers

我正在尝试通过preg_replacing过滤字符串。除了数字和点之外的任何东西,在点之前不超过5个数字。在wamp(UptoDate)下的PHP 5.4.3。

Good Matche:

  • 0.01
  • 0.1
  • 12345.11
  • 12345.1
  • 1
  • 12345

糟糕的比赛:

  • 0,10
  • 0,1
  • 12345,11
  • 12345,1
  • 123456

我遇到的第一个问题是我无法删除(,)逗号,我只想保留一个(。)点作为分隔符。请记住,这是一个价格字符串。 Php似乎不用(,)逗号来计算,所以我希望输入只能用。而不是逗号。所以我使用(^),否定字符类,然后0-9。 。然后我添加要匹配的字符数。我在1-5之间(1或2或3或...... 5

我做错了什么。

以下是我一直用来帮助的信息: http://www.regular-expressions.info/reference.html http://www.expreg.com/options.php

<?php $string = 'asd321asd321df564d.fasd321asd12';

$string = cleanabc123($string);

function cleanabc123($data) {   $data =
preg_replace("/([^0-9\s\.]){1,5}/u", "", $data);    return $data; }

// This will be 'username' now echo $string; ?>

2 个答案:

答案 0 :(得分:1)

反转你的意图更有意义:使用preg_match()只能找到一个好的结果。否则返回FALSE或NULL。

这样,您的正则表达式将更易于编写和理解。

顺便说一下,你现在这样做的方式,你最好使用preg_replace("/[^\d\.]/u", "", $str),替换所有不正确的字符而不管其位置。

答案 1 :(得分:0)

我会替换

preg_replace("/([^0-9\s\.]){1,5}/u", "", $data);

$match = preg_match("/^[0-9]+([,.][0-9]{1,5})?$/u", $data);

我希望在这种情况下使用preg_match,我会返回$match