我需要为这些表达式设置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]." €";
由于
答案 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和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]+)
- 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;组)。