0

我正在分解的字符串中有这些类型的可能内容:

$string = "$100 USD per year"
$string = "$100USD per year"
$string = "100 USD per year"
$string = "100EUR per year"
$string = "€100EUR per year"
$string = "€100 EUR per year"

这是我正在使用的正则表达式(它适用于 Expresso):

$pattern = "/\$?(\d+\.\d+)(\w{0,3})\s(.*)/i";

基本上,我希望最终结果是一个如下所示的数组:

$arr[0] = "$100" // the "$" optional, also number might be integer or decimal
$arr[1] = "USD";
$arr[2] = "per year";

这是我正在运行但无济于事的示例 PHP 代码:

<?php
$content = "$99.37CAD per year";

$pattern = "/\$?(\d+\.\d+)(\w{0,3})\s(.*)/i";

$myArr = preg_split($pattern, $content);

echo "<pre>";
var_dump($myArr);
echo "</pre>";
?>

输出是:

bool(false)

有人可以指出我正确的方向吗?

4

2 回答 2

2

你不需要matchsplit..

正则表达式也应该是

  |->required to capture $ or €
  |                |-----------|-------->needed since there can be 0 to many spaces
 --               ---         ---
/.?(\d+(?:\.\d+)?)\s*(\w{0,3})\s*(.*)/
       ----------                
           |
           |
           |->this is needed since it would not always be 55.43..it could be 55
于 2012-12-01T12:40:02.797 回答
2

问题是SPACE价格和欧元/加元/美元之间的关系不是可选的。所以你只需要添加一个*,比如\s*. 这样,您将告诉 RegEx 该空间是可选的,因此它可以是也可以不是。

另一件事是你必须匹配,而不是分裂。小数位可选。

演示正则表达式:[$€]?(\d+(?:\.\d+)?)\s*(\w{0,3})\s*(.*)

于 2012-12-01T12:42:49.870 回答