preg匹配货币模式

时间:2017-12-11 16:42:05

标签: php preg-match

https://regex101.com/r/3e0fbp/2

我有一些模式可以匹配货币金额,但有些模式不能100%运作

草堆

(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{2}-?(?![\d.,%]|(?: %))

匹配2位小数(不匹配百分比)

(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,]|[.,]\d{1,2})-?(?![\d.,%]|(?: %))

这种模式有效!

匹配金额为0-2小数(不匹配百分比)

20%

此模式不起作用。匹配(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{1,2}-?(?![\d.,%]|(?: %))

匹配数量为1-2位小数(不匹配百分比)

(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{2}-?(?![\d.,])

这种模式有效!

匹配金额为2位小数(可能与百分比匹配)

(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,]|[.,]\d{1,2})-?(?![\d.,])

这种模式有效!

匹配金额为0-2小数(可能与百分比匹配)

333.294

此模式不起作用。与(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{1,2}-?(?![\d.,])

不符

匹配数量为1-2位小数(可能与百分比匹配)

function get_number_pattern(int $decimals_min=2, int $decimals_max=2, bool $allow_percentage=false): string{
    $pattern = '(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*';

    if($decimals_min || $decimals_max){
        if($decimals_min == $decimals_max){
            $decimal_num = $decimals_min;
        }
        else{
            $decimal_num = ($decimals_min ?: '1').','.$decimals_max;
        }

        $decimals = '[.,]\d{'.$decimal_num.'}';
        if($decimals_min){
            $pattern .= $decimals.'-?';
        }
        else{
            $pattern .= '(?:[^.,]|'.$decimals.')-?';
        }
    }

    $negative_trailing = [
        '[\d'.($decimals ? '.,' : '').($allow_percentage ? '' : '%').']'
    ];

    if(!$allow_percentage){
        $negative_trailing[] = '(?: %)';
    }

    $pattern .= '(?!'.implode('|', $negative_trailing).')';

    return $pattern;
}

echo get_number_pattern()."\n";
echo get_number_pattern(0, 2)."\n";
echo get_number_pattern(1, 2)."\n";

echo get_number_pattern(2, 2, true)."\n";
echo get_number_pattern(0, 2, true)."\n";
echo get_number_pattern(1, 2, true)."\n";

这种模式有效!

{{1}}

1 个答案:

答案 0 :(得分:0)

尝试这是第一个问题(在第一个数字后你错过了小组中的%):

(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,%]|[.,]\d{1,2})-?(?![\d.,%]|(?: %))

这是第二个(这里你错过了最后的%和空格):

(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,]|[.,]\d{1,2})-?(?![\d.,])(?: ?%)?