preg_match_all

时间:2009-02-25 15:41:31

标签: php preg-match-all

有人可以向我解释这个我不熟悉preg_match_all过滤器,这段代码工作正常,但如果其中一个纬度和经度是负数,它就不会返回负值。

if ( preg_match_all( "#<td>\s+-?(\d+\.\d+)\s+</td>#", $output, $coords ) ) {
    list( $lat, $long ) = $coords[1];
    echo "Latitude: $lat\nLongitude: $long\n";
}

输出:     Latitude: 30.6963 Longitude: 71.6207(经度缺少' - ')

3 个答案:

答案 0 :(得分:3)

coords变量的值取决于括号内代码匹配的内容。在括号内移动可选的减号(-?)应该可以解决问题:

if ( preg_match_all( "#<td>\s+(-?\d+\.\d+)\s+</td>#", $output, $coords ) ) {

有关preg_match_all的详细信息,请参阅official documentation有关preg的详细信息,请参阅php.net/preg_match_all

答案 1 :(得分:1)

您的标志不在括号中。 $ coords [1]包含与(和)之间的部分匹配的正则表达式部分。但是,+ - 在括号之前,因此它们不是匹配和返回的部分。

答案 2 :(得分:0)

如果您不喜欢preg_match() API,则可以使用T-Regx tool-真的很棒

$p = "<td>\s+(-?\d+\.\d+)\s+</td>"; // no delimiters :)

pattern($p)->match($output)->forEach(function (Match $match) {
    $match->text();

    // or
    $match->group(1)->text();
    // or check if it's matched
    $match->group(1)->matched();
});