想要根据当前情况给出输入的preg_match()模式... PHP

时间:2017-04-14 15:02:47

标签: php regex

如果存在十进制分隔符(点(。)或逗号(,)和千位分隔符(逗号(,)或点(。)),则应按模式处理传入值。 我目前的代码是

if (!preg_match('/^((?:(?:\-?[\d' . $thousandSeparator . ']+(?:' . $decimalSeparator . '\d+)?)|\s*))\s*(.*)$/', $value, $matches)) 
{
   throw_error;
}

案例1 - $ decimalSeparator ='。';; $ thousandSeparator =',';

允许的案例 -

  • 45,789.45
  • 45,789.45 cm
  • 789 cm
  • 789.45 cm
  • 1,789厘米
  • 78,789,756.45

不允许的情况 -

  • 45.789,78
  • 45.789,78 cm
  • 78.7.78,78
  • 7.8,5
  • 7.8 cm

案例2 - $ decimalSeparator =','; $ thousandSeparator ='。';

允许的案例 -

  • 45.789,78
  • 45.789,78 cm
  • 789,45
  • 1.789 cm
  • 789

不允许的情况 -

  • 45,789.45
  • 45,789.45 cm
  • 789 cm
  • 789.45 cm
  • 1,789厘米
  • 78,789,756.45
  • 78,78,78 cm

注意 - 'cm'是厘米,可变,可以是英寸,毫米,公里等。单位可以存在或不存在,但如果存在,则需要处理。现在我随机放置了这个单元,请不要考虑单元,因为它是精确的方式。

感谢。 :)

1 个答案:

答案 0 :(得分:3)

你可以像这样构建你的模式:

$units = ['[mck]m', 'inch']; // complete it
$pattern = sprintf('~^-?\d{1,3}(?:[%s]\d{3})*(?:[%s]\d\d)?(?: (?:%s))?$~', $thousandSep, $decimalSep, implode('|', $units));