PHP正则表达式只允许一个小数和一个百分号

时间:2017-11-15 01:37:32

标签: php regex

你好我试图创建一个正则表达式来验证一个百分比值,但我只想在至少一个数字和一个百分号之后允许一个小数作为最后一个字符。例如,以下值应该有效:

8%

10%

12.60%

7.750%

到目前为止,这是我的php函数的正则代码。

if(!preg_match('/[^0-9.%]/', $string)){
    return true;
} else {
    return false;
}

3 个答案:

答案 0 :(得分:1)

这可以通过使你的正则表达式更具体来实现:

^\d+(?:\.\d+)?%$

在regex101上试试:

https://regex101.com/r/D9JN3e/3

答案 1 :(得分:1)

这个正则表达式应该是您正在寻找的:

const done = [
 {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "not yet", "done"]},
 {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "done", "done"]},
 {days:["Monday", "Tuesday", "Friday"] ,job: ["done", "not yet", "not yet"]},
]

// Keep days that occur done in all "weeks"
const numWeeks = done.length;

// Loop through all weeks and days to see when they are "done"
const daysObj = done.map((x) => x.job.map((x) => x == "done")
  .map((y, index) => y ? x.days[index] : ""))
  .map((x) => x.filter((day) => day))
  .reduce((acc, curr) => acc.concat(curr))
  .reduce(function(p, c){
    if (c in p) {
      p[c]++;
    } else {
      p[c]=1;
    }
    return p;
  }, {});
console.log(daysObj);
// {Monday: 3, Friday: 2, Tuesday: 1}

// Find days that occur done in all weeks
const result = Object.keys(daysObj)
  .map((x) => daysObj[x] == numWeeks ? x : null)
  .filter((x) => x)
console.log(result);
// ["Monday"]

所有以下内容都通过了这个正则表达式:

  • 1%

  • 1.5%

  • 10%

  • 10.5%

  • 10.555%

任何带有两个百分号的内容都会失败,而像^[0-9][0-9]?(?:\.[0-9]+)?\%{1}$ 这样格式错误的表达式也会失败。

答案 2 :(得分:1)

模式:/^\d+(?:\.\d+)?%$/

演示:https://regex101.com/r/7mqiIJ/1

说明:

^            #start of the string
\d+          #match one or more digits
(?:          #start a non-capturing group
    \.\d+    #match one decimal point (dot) followed by one or more digits
)?           #make the group optional
%            #match one percent sign
$            #end of the string

您可能希望完全考虑要验证为false的任何边缘情况。

边缘案例:

  • 01%(领先可忽略的零)

  • .10%(尾随省略零)

这些案例可能不是将某个值视为无效的理由,但可能/应该删除可忽略的零值。 (如果你想要聪明一点,这可以作为preg_match电话的一部分来完成。)

要省略前导零,您可以使用:/^0*\K\d+(?:\.\d+)?%$/匹配所有前导0,然后重新启动与\K的全字符串匹配。尾随零(在%之前)将需要不同的方法 - 但也许他们不会打扰你。

以下是执行方式:(Demo

$string='10.99%';
if(preg_match('/^\d+(?:\.\d+)?%$/',$string)){
    echo 'valid';
} else {
    echo 'invalid';
}

echo "\n\n";

$string='10.%';
if(preg_match('/^\d+(?:\.\d+)?%$/',$string)){
    echo 'valid';
} else {
    echo 'invalid';
}

输出:

valid

invalid