0

有人可以向我解释一下吗,我不熟悉 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 经度缺少'-')

4

3 回答 3

3

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

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

php 中 preg 的详细信息官方文档,.preg_match_all

于 2009-02-25T15:44:13.507 回答
1

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

于 2009-02-25T15:45:38.277 回答
0

如果你不喜欢preg_match()API,你可以使用T-Regx 工具——它真的很酷

$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();
});
于 2019-01-24T16:00:59.160 回答