2

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

好搭配:

  • 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; ?>
4

2 回答 2

1

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

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

顺便说一句,按照您现在的操作方式,您最好使用preg_replace("/[^\d\.]/u", "", $str),替换所有不正确的字符,而与它们的位置无关。

于 2013-01-22T21:44:55.593 回答
0

我会替换

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

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

我更喜欢preg_match在这种情况下使用,我会返回$match.

于 2013-01-22T21:46:44.230 回答