Я стараюсь изо всех сил, чтобы получить простой текст из API карт Google Maps, где он говорит html_instructions в json. все закодировано в html, и я хочу выводить простой текст.
вот что я получаю
изображение 1
это то, что я хочу: изображение 2
Я попробовал любой тип preg_replace, он не мог мне помочь.
Google Maps API-ссылка
Ссылка на сайт
РЕДАКТИРОВАТЬ: Предыдущий фрагмент кода удален и заменен работоспособной небольшой программой.
Обратите внимание, что когда вы обрабатываете данные с помощью json_decode (), сегменты Unicode, такие как \u003cb\u003eFlintergata\u003c/b\u003e
преобразованы в <b>Flintergata</b>
, Это очень помогает сделать Regex более читабельным.
Обратите внимание $details
Массив является многоуровневым ассоциативным массивом, поэтому вам нужно покопаться, как показано, чтобы найти нужные вам данные.
Также обратите внимание, что предоставленный вами URL приводит к 1 маршруту с 1 участком. Таким образом, предоставленный мною код показывает и обрабатывает первую часть первого маршрута.
Если вы используете другой URL, вы можете получить несколько маршрутов, каждый из которых состоит из нескольких шагов. Код по-прежнему будет обрабатывать первый этап первого маршрута, но каждый из них (с внешними циклами) будет отображать все из них (не показано ниже).
Объяснение строки регулярного выражения ‘»~> ([A-Z]. *?)<~ «‘заключается в следующем.
'#'
на каждой стороне есть разделители PHP — но вы также можете использовать другие символы и не будет иметь никакого значения.
<b>
а также </b>
говорят, что каждая совпадающая строка должна начинаться с <b>
и заканчивается </b>
,
Внутри ( )
«группа захвата», которая говорит, что мы хотим извлечь только ту часть строки (исключая <b>
а также </b>
).
[A-Z]
говорит начать с заглавной буквы
.*
говорит следовать с 0 или более любого символа.
?
делает * non_greedy, поэтому в этом случае останавливает текущее совпадение, когда оно встречает следующее <
,
Список совпадений для каждой строки входит в массив с именем $matches
а также $matches[1]
массив совпадений группы захвата (т. е. текст в <b>
а также </b>
устранен).
<?php
$json = file_get_contents("https://maps.googleapis.com/maps/api/directions/json?origin=sandnes&destination=vigrestad&key=");
$details = json_decode($json,true);
// $details is a large associative array
// print all the instructions for the first step of the fist leg of the first route
echo PHP_EOL."Here are the unfiltered html instructions for first leg of first route ".PHP_EOL.PHP_EOL;
$steps = $details['routes'][0]['legs'][0]['steps'];
foreach($steps as $step){
echo($step['html_instructions']).PHP_EOL; // print to see format
// we see unicode html_entities have been replaced and now look like <b> </b> etc
}
// now extra the required information from each step
echo PHP_EOL."Here are the filtered html instructions for first leg of first route ".PHP_EOL.PHP_EOL;
foreach ($steps as $step)
{
//preg_match_all("~003e([A-Z].*?)\\\\u003c~", $step['html_instructions'], $match); // not needed now
preg_match_all('#,<b>([A-Z].*?)</b>#, $step['html_instructions'], $match); // now detects strings between '>' and '<'
foreach($match[1] as $instructionPart)
{
echo $instructionPart." ";
}
echo PHP_EOL;
}
?>
Других решений пока нет …