有人可以向我解释这个我不熟悉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
(经度缺少' - ')
答案 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();
});