【问题标题】:Php Preg_Replace not matching quantity of charactersPhp Preg_Replace 字符数不匹配
【发布时间】:2013-01-06 06:23:31
【问题描述】:

我正在尝试通过 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; ?>

【问题讨论】:

  • 请记住,点不是字符类中的元字符,因此我们不需要使用反斜杠对其进行转义。
  • 好吧,这是正确的:/[^0-9.\s]/。但我仍然没有得到我期望的结果。

标签: php preg-replace digits quantifiers


【解决方案1】:

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

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

顺便说一句,按照你现在的做法,你最好使用preg_replace("/[^\d\.]/u", "", $str),替换所有不正确的字符,而不管它们的位置。

【讨论】:

  • 是的,你说得对,使用 preg_match 可能会更好,但我不确定我是否可以将它与来自 html 输入“prices[]”的数组一起使用。
  • 没关系,问题解决了。我只需要按数组条目 preg_match 数组条目。提前致谢。
【解决方案2】:

我会替换

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

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

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

【讨论】:

  • 是的,谢谢,这是对我有用的模式。返回匹配的数组。这些参数是什么:“?$”?
  • 好吧,? 说它是可选部分。因此,如果您的号码没有 [,.][0-9]{1,5} 部分,那也没关系。此外,^ ... $ 运算符表示字符串必须以^ 开始和$ 完成表达式定义的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多