preg_match积极前瞻的麻烦

时间:2013-08-07 03:11:21

标签: php regex preg-match

我有两个字符串

<span class="price" id="product-price-2095">$425.00</span>
<span class="price" id="product-price-355">$25.00</span>

我需要从这些字符串中提取价格$ 425.00和$ 25.00

我一直在使用这个

preg_match('/(?<=<span class="price" id="product-price-[0-9]{3}">)(.+?)(?=<\/span>)/s', $product, $priceArray);

我遇到的问题是[0-9] {3}部分。它只适用于25.00的价格 但如果我将3更改为4,它将仅适用于425.00的价格 我试过[0-9] {3,4},但我收到以下错误

警告:preg_match()[function.preg-match]:编译失败:lookbehind断言在偏移量56处不是固定长度

我可以做些什么来使它匹配,无论数字在哪里“product-price - ###”?

1 个答案:

答案 0 :(得分:0)

Lookarounds有它们的位置,但不幸的是不能变化。这是一种没有环顾四周的方法。我正在使用分组捕获,因此您可以从preg_match_all()提供的数组中进行选择。

<?php

$string = '<span class="price" id="product-price-2095">$425.00</span>
<span class="price" id="product-price-355">$25.00</span>';

$pattern = '!(<span\sclass\="price"\sid\="product-price-\d{3,4}">)([^<]+)(</span>)!i';
$m = preg_match_all($pattern,$string,$matches);

print_r($matches)

?>

<强>输出

Array
(
    [0] => Array
        (
            [0] => <span class="price" id="product-price-2095">$425.00</span>
            [1] => <span class="price" id="product-price-355">$25.00</span>
        )

    [1] => Array
        (
            [0] => <span class="price" id="product-price-2095">
            [1] => <span class="price" id="product-price-355">
        )

    [2] => Array
        (
            [0] => $425.00
            [1] => $25.00
        )

    [3] => Array
        (
            [0] => </span>
            [1] => </span>
        )

)