0

我有一个字符串,我试图在其中分解为易于处理的数据。对于这个例子,我想要收入共识数据。

$digits = '[\$]?[\d]{1,3}(?:[\.][\d]{1,2})?';
$price = '(?:' . $digits . '(?:[\-])?' . $digits . '[\s]?(?:million|billion)?)';

$str = 'revenue of $31-34 billion, versus the consensus of $29.3 billion';
preg_match_all('/(?:revenue|consensus)(?:.*)' . $price . '/U', $str, $matches[]);
print_r($matches);

回报:

Array (
    [0] => Array (
        [0] => Array (
            [0] => 'revenue of $31'
            [1] => 'consensus of $29'
        )
    )
)

我所期待的:

Array (
    [0] => Array (
        [0] => Array (
            [0] => 'revenue of $31-34 billion'
            [1] => 'consensus of $29.3 billion'
        )
    )
)

当我省略U修饰符时:

Array (
    [0] => Array (
        [0] => Array (
            [0] => 'revenue of $31-34 billion, versus the consensus of $29.3 billion'
        )
    )
)

我不能of在 中用作明确的模式revenue of $31-34 billion,数据可能/可能不会使用它,因此我使用了(?:.*).

4

1 回答 1

2
preg_match_all('/(?:revenue|consensus)(?:.*?)' . $price . '/', $str, $matches[]);
                                           ^               ^  

您可以通过添加 , 使一个特定的通配符非贪婪?,如.*?. 摆脱全局/U修饰符并将上面的通配符更改为非贪婪,离开$digits$price独自一人。

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => revenue of $31-34 billion
                    [1] => consensus of $29.3 billion
                )
        )
)
于 2013-04-04T13:40:01.230 回答