Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_split不适用于价格提取_Php_Regex_Preg Split - Fatal编程技术网

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