0

Could some one explain this to me i am not familiar with preg_match_all filters, this code works fine except it does not return a negative value if one of the latitudes and longitudes is negative.

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

output: Latitude: 30.6963 Longitude: 71.6207 (longitude is missing a '-')

phihag
  • 278,196
  • 72
  • 453
  • 469
hitek
  • 372
  • 1
  • 17
  • 33

3 Answers3

3

The value of the coords variable depends on what is matched by the code inside the parentheses. Moving the optional minus sign (-?) inside the parentheses should do the trick:

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

See the official documentation for details about preg in php and php.net/preg_match_all for the details of preg_match_all.

phihag
  • 278,196
  • 72
  • 453
  • 469
1

Your sign is not in the parenthesis. $coords[1] contains the part of the regex that matched the part between ( and ). The +- are before the parenthesis, though, thus they are not part of what is matched and returned.

Mecki
  • 125,244
  • 33
  • 244
  • 253
0

If you don't like preg_match() API, you can use T-Regx tool - it's really cool

$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();
});
Danon
  • 2,771
  • 27
  • 37