Извлечение данных между двумя строками с помощью PHP - PullRequest
0 голосов
/ 15 июня 2019

У меня есть следующая строка:

$html = '"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"';

Я хотел бы извлечь данные lat и lng.

Это моя попытка:

$lat = preg_match_all('#lat":"(.*?)","lng#', $html, $matches);
$lat = matches[1];

Но это не работает.

Не могли бы вы мне помочь, пожалуйста?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 15 июня 2019

json_decode гораздо надежнее, чем регулярное выражение. Добавьте фигурные скобки и значение для отсутствующего элемента "address", и вы можете сразу внести в результат индекс:

<?php
$html = '"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"';

$decoded = json_decode('{'.$html.':""}', true);

echo "lat: ".$decoded["lat"]."  lng: ".$decoded["lng"];

Выход:

lat: 45.491834  lng:  -73.606953
3 голосов
/ 15 июня 2019

"lat":"\s*([^"]*?\s*"),"lng":"\s*([^"]*?\s*)"\K

Значения в группе 1 и группе 2

https://regex101.com/r/jDWL84/1

Php код

Демонстрация песочницы

 <?php

 $str = '
 "id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"
 "id":75550,"name":"Name","lat":"44.491834","lng":" -72.606953","address"
 "id":75551,"name":"Name","lat":"43.491834","lng":" -71.606953","address"
 ';

 $cnt = preg_match_all('/"lat":"\s*([^"]*?\s*)","lng":"\s*([^"]*?\s*)"\K/', $str, $latlng, PREG_SET_ORDER );

 if ( $cnt > 0 )
 {
     // print_r ( $latlng );
     for ( $i = 0; $i < $cnt; $i++ )
     {
         echo "( lat, long ) = ( " . $latlng[$i][1] . ", " . $latlng[$i][2] . " )\n";
     }
 }

 >

Выход

( lat, long ) = ( 45.491834, -73.606953 )
( lat, long ) = ( 44.491834, -72.606953 )
( lat, long ) = ( 43.491834, -71.606953 )
2 голосов
/ 15 июня 2019

Это выражение, скорее всего, извлечет желаемые данные о широте и долготе в этой группе захвата (.+?), поскольку оно также удаляет нежелательные пробелы:

("lat":|"lng":)"\s*(.+?)\s*"

Проверка

$re = '/("lat":|"lng":)"\s*(.+?)\s*"/m';
$str = '"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches[0][2]);
var_dump($matches[1][2]);


foreach ($matches as $key => $value) {
    echo $value[2] . "\n";
}

Вывод

45.491834
-73.606953

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...