preg_match_all 价格的正则表达式

Regex for preg_match_all prices

我需要为这些表达式设置正则表达式:

number€
number €
€number
€ number

需要输出:数字 €

number$
number $
$number
$ number

需要输出:数字$

我必须为每一个写一个正则表达式吗?哪种方法简单?

数字示例€:

preg_match_all("/((?:[0-9]*[.,])?[0-9]+)\p{Sc}/u", $post->post_title, $percentage, PREG_SET_ORDER);          
        if(isset($percentage[0][0]) && $percentage[0][0] != "" ){    
        $text = $percentage[0][1]." €";

谢谢

您似乎可以使用一个带有 preg_replace_callback:

的正则表达式
/(?J)(?<num>[0-9]*[.,]?[0-9]+)\s*(?<cur>\p{Sc})|(?<cur>\p{Sc})\s*(?<num>[0-9]*[.,]?[0-9]+)/u

参见regex demo and a PHP demo

$re = '/(?J)(?<num>[0-9]*[.,]?[0-9]+)\s*(?<cur>\p{Sc})|(?<cur>\p{Sc})\s*(?<num>[0-9]*[.,]?[0-9]+)/u';
$str = '12€';
echo preg_replace_callback($re, function($m) {
    return $m["num"] . " " . $m["cur"];
}, $str);

或者,要提取 number currency 顺序的值,请使用相同的正则表达式和以下代码:

$res = array();
preg_replace_callback($re, function($m) use (&$res) {
    array_push($res, $m["num"] . " " . $m["cur"]);
    return $m[0];
}, $str);
print_r($res);

参见 another PHP demo

图案详情:

  • (?J) - PCRE_INFO_JCHANGED 修饰符,以便相同匹配的组可以在模式中多次使用
  • (?<num>[0-9]*[.,]?[0-9]+) - "num" 组捕获 float/integer
  • \s* - 0+ 个空格
  • (?<cur>\p{Sc}) - 组 "cur" 捕获货币符号
  • | - 或(然后以不同的顺序与上面相同)
  • (?<cur>\p{Sc})\s*(?<num>[0-9]* [.,]?[0-9]+) - 货币符号("cur" 组),0+ 个空格,一个 float/integer(在 "num" 组中)。