不捕获我的PHP正则表达式中的百分号?

gre*_*emo 0 php regex percentage preg-match

还在学习正规表达!我的正则表达式百分比(不遵守100限制):

^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?\%?$
Run Code Online (Sandbox Code Playgroud)

应该允许:

  • [1-9] 从不同于0的数字开始.不允许使用"004.34"之类的百分比.
  • [0-9]* ...后跟0到9之间的任何数字
  • |[0] 或者从单个0开始

...将此组捕获为"int"组.然后:

  • (?<dec>\.[0-9]+)? 一个可选组,只有在0到9之间至少有一个数字后才允许一个点.我不希望人们输入即"33".

假设我是对的,测试:

preg_match('/^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?\%?$/i', '0.32%', $result);
Run Code Online (Sandbox Code Playgroud)

给我这个结果,这实际上是正确的,但是:

Array
(
    [0] => 0.32%
    [int] => 0
    [1] => 0
    [dec] => .32
    [2] => .32
)
Run Code Online (Sandbox Code Playgroud)

如何避免捕获百分比"%"符号(in $result[0])?

Aus*_*ust 6

这真的很简单.只需将正则表达式更改为:

/^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?/
Run Code Online (Sandbox Code Playgroud)

(\%?$从匹配中删除).

如果你想确保%符号存在,但是不想捕获它(在这种情况下似乎无关紧要,但也许)你可以添加一个先行断言.(?=...)断言确保模式存在,但它不会改变匹配的内容.

/^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?(?=%?$)/
Run Code Online (Sandbox Code Playgroud)