php preg_match positive lookahead没有按预期工作

时间:2011-12-14 09:48:53

标签: php regex preg-match

$regex  = '/(?<=(total: ))(\$\d+\.\d+)/';
$search = '$1.25 cart total: $24.99 $55.50';

preg_match($regex, $search, $price);

我想从上面的字符串中提取'$ 24.99'。

当我打印$ price数组时,它是空白的。根据这个工具:http://regexr.com?2vfm9我的正则表达式应该正常工作。当我仅使用正则表达式的“(\ $ \ d +。\ d +)”部分运行代码时,数组会返回所有价格......所以我知道该部分正在运行。

我是否错误地实施了正面预测?还有其他想法吗?


更新: 我想我可能已经找到了问题:

我正在解析的文字有一个“&amp; nbsp;”结肠后。当我向自己显示原始文本时,它没有显示,但是正在干扰正则表达式。我会更新确认。

3 个答案:

答案 0 :(得分:0)

你不需要在total:周围捕捉括号,事实上它们在这种情况下甚至是有害的。他们抓住了。

尝试没有它们。

顺便说一句,你在这里使用的是一个积极的外观,而不是前瞻,我不明白你为什么要使用它?

答案 1 :(得分:0)

问题是您的\未转义:

$regex  = '/(?<=(total: ))(\\$\\d+\\.\\d+)/';

答案 2 :(得分:0)

要处理&nbsp;,您可以使用:

$regex  = '/(?<=(total:))[^$]+(\$\d+\.\d+)/';
$search = '$1.25 cart total:&nbsp;$24.99 $55.50';

preg_match($regex, $search, $price);
print_r($price);    

<强>输出:

Array
(
    [0] => &nbsp;$24.99
    [1] => total:
    [2] => $24.99
)