正则表达式为preg_match_all价格

时间:2017-01-19 08:48:49

标签: regex preg-match-all

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

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]." €";

由于

1 个答案:

答案 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 demoPHP 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]+) - Group&#34; num&#34;捕获浮点数/整数
  • \s* - 0+ whitespaces
  • (?<cur>\p{Sc}) - Group&#34; cur&#34;捕获货币符号
  • | - 或(然后以不同顺序与上述相同)
  • (?<cur>\p{Sc})\s*(?<num>[0-9]* [.,]?[0-9]+) - 货币符号(&#34; cur&#34;组),0 +空格,浮点数/整数(&#34; num&#34;组)。