Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 自由货币规则_Php_Regex - Fatal编程技术网

Php 自由货币规则

Php 自由货币规则,php,regex,Php,Regex,我正在开发一个PHP应用程序。我需要验证字符串是否可用作货币值。我想验证以下内容: $5.00 5. 5 £5.00 我希望模式足够自由,可以接受一个合理的字符串。我也希望它接受一个货币符号;但是,为了验证货币,它可以是任意字符,因为我最终将把值存储为两个十进制浮点。因此,“5.00美元”或“5.00美元”在存储在数据库中时将变为“5.00”。我目前正在使用以下工具: preg_match('/^[0-9]*\.?[0-9]+$/',$value) 它适用于5或5.00,但不考虑货币符

我正在开发一个PHP应用程序。我需要验证字符串是否可用作货币值。我想验证以下内容:

$5.00 5. 5 £5.00 我希望模式足够自由,可以接受一个合理的字符串。我也希望它接受一个货币符号;但是,为了验证货币,它可以是任意字符,因为我最终将把值存储为两个十进制浮点。因此,“5.00美元”或“5.00美元”在存储在数据库中时将变为“5.00”。我目前正在使用以下工具:

preg_match('/^[0-9]*\.?[0-9]+$/',$value)
它适用于5或5.00,但不考虑货币符号。如何调整此值以允许使用货币符号

谢谢大家!


编辑:根据下面的评论,我的正则表达式似乎允许太多的小数。你能帮我解决这个问题吗

允许您使用所有需要使用的货币符号

\p{Sc}或\p{Currency_Symbol}:任何货币符号

试试这个:

$value=preg_replace('/^(\p{Sc}?\d*)((\.|,)\d\d\d)?\d*$/u','$1$2',$value);

但是,如果您希望输入数字,最好在用户从可选列表中指定货币的位置创建一个列表,并注意用户是否只引入数字,PAYPAL就是这样做的。

regex怪物如下所示:

/^(?<currency_left>\p{Sc}|[A-Z]{3})?\s*
  (?<amount>(?:(?!,)[,\d]*)(?:(?=.\d)|(?<=\d))(?:\.\d*)?)\s*
  (?<currency_right>(?(currency_left)|(?:\p{Sc}|[A-Z]{3})))?$/ui
\p{Sc}匹配任何货币符号


这将匹配可选的3位货币符号或代码,后跟正数,后跟货币符号或3位代码。数字可以包含一个小数点,或小数点前的逗号。货币符号可以出现在数字之前或之后,但不能同时出现在两者之间。集团金额存储小数部分,货币左和货币右货币左和货币右不匹配。

谢谢,但我认为我不够清楚。我需要它来验证任何货币符号,或者如果用户输入类似“USD”的东西。这将接受5.1和5.111、.0和05。它不接受5英镑。或使用分数分隔符的货币。正则表达式中隐藏着龙。@pst…感谢您指出我的正则表达式将允许5.111。我刚刚把这个添加到问题中。@nEAnnam:别忘了添加UTF-8修饰符,/u。像\p{Sc}这样的Unicode属性没有它就不能工作。@nEAnnam…谢谢!我要试一下这个。我很喜欢让用户从select中选择货币的想法;然而,我在这里试图做的是确保即使他们输入$5.00之类的内容并从下拉列表中选择$sign,我也可以验证数据。不管怎样,我最终还是去掉了存储的$sign。我可以想象有一个现有的库可以做到这一点。单个正则表达式-不包括perl怪物;-可能不会涵盖所有案例。首先要确定支持哪些案例及其含义,包括转换为适当的货币类型值。@pst…谢谢!我知道这不是正则表达式的理想用法,但我只是在寻找一种相对简单的方法或提供一些简单的验证。这不一定是防弹的。你知道有任何这样的库吗?你需要有每一个单独的货币表示符才能工作-$、欧元、美元等。否则,它将不够全面。