【问题标题】:preg_split does not work with price extractionpreg_split 不适用于价格提取
【发布时间】:2012-12-01 12:36:20
【问题描述】:

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

$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)

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

【问题讨论】:

    标签: php regex preg-split


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!这行得通,但我必须避开 $ 和欧元符号,如下所示:/[\$\€]?(\d+(?:\.\d+)?)\s*(\w{0,3})\s*(.*)/
    【解决方案2】:

    你需要match而不是split..

    正则表达式也应该是

      |->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
    

    【讨论】:

    • 这段代码几乎可以工作,除非没有货币符号$string = 99.37 CAD per year——在这种情况下,它会删除第一个字符,所以$arr[1] = 9.37。我将您的回复标记为答案,直到我进一步测试并发现该问题。对此我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多