Php preg_split不适用于价格提取
我要分解的字符串中可能包含以下类型的内容:Php preg_split不适用于价格提取,php,regex,preg-split,Php,Regex,Preg Split,我要分解的字符串中可能包含以下类型的内容: $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中工作): 基本上,我希望最终结果是如下所示的数组: $
$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中工作):
基本上,我希望最终结果是如下所示的数组:
$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>";
?>
有人能给我指出正确的方向吗?你需要
匹配而不是拆分
正则表达式也应该是
您需要匹配
而不是拆分
正则表达式也应该是
问题在于价格与欧元/加元/美元之间的空格
,不是可选的。因此,您只需向它添加一个*
,如\s*
。有了它,您将告诉RegEx该空间是可选的,所以它可以是也可以不是
另一件事是你必须匹配,而不是分裂。小数位数可选
正则表达式:[$€]?(\d+(?:\.\d+))\s*(\w{0,3})\s*(*)
问题是价格和欧元/加元/美元之间的空间不是可选的。因此,您只需向它添加一个*
,如\s*
。有了它,您将告诉RegEx该空间是可选的,所以它可以是也可以不是
另一件事是你必须匹配,而不是分裂。小数位数可选
正则表达式:[$€]?(\d+(?:\.\d+))\s*(\w{0,3})\s*(.*)
除了在没有货币符号的情况下,此代码几乎可以工作$string=99.37 CAD/年
——在这种情况下,它会删除第一个字符,因此$arr[1]=9.37
。在我进一步测试并发现问题之前,我将您的回答标记为答案。对此我深表歉意。除了没有货币符号的情况外,此代码几乎可以正常工作。$string=99.37 CAD/年
——在这种情况下,它会删除第一个字符,因此$arr[1]=9.37
。在我进一步测试并发现问题之前,我将您的回答标记为答案。我为此道歉,谢谢!这是有效的,除了我必须避开$和欧元符号,比如:/[\$\€](\d+(?:\.\d+)\s*(\w{0,3})\s*(*)/
谢谢!这是有效的,除了我必须避开$和欧元符号,比如:/[\$\€](\d+(?:\.\d+)\s*(\w{0,3})\s*(*)/
<?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)
|->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