preg_match_all - PullRequest
       13

preg_match_all

0 голосов
/ 25 февраля 2009

Может кто-нибудь объяснить мне, что я не знаком с фильтрами 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 ]

3 голосов
/ 25 февраля 2009

Значение переменной coords зависит от того, что соответствует коду внутри скобок. Перемещение необязательного знака минус (-?) в скобках должно помочь:

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

См. официальную документацию для получения подробной информации о preg в php и php.net / preg_match_all для получения подробной информации о preg_match_all.

1 голос
/ 25 февраля 2009

Вашего знака нет в скобках. $ ords [1] содержит часть регулярного выражения, которая соответствует части между (и) + - перед скобкой, поэтому они не являются частью того, что сопоставляется и возвращается.

0 голосов
/ 24 января 2019

Если вам не нравится 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();
});
...