РЕДАКТИРОВАТЬ: Предыдущий фрагмент кода удален и заменен работоспособной небольшой программой.
Обратите внимание, что при обработке данных с помощью json_decode () сегменты Юникода, такие как \u003cb\u003eFlintergata\u003c/b\u003e
, преобразуются в <b>Flintergata</b>
. Это очень помогает сделать Regex более читабельным.
Обратите внимание, что массив $details
является многоуровневым ассоциативным массивом, поэтому вам нужно покопаться, как показано, чтобы найти нужные данные.
Обратите внимание, что указанный вами URL приводит к 1 маршруту с 1 участком. Таким образом, предоставленный мною код показывает и обрабатывает первый этап первого маршрута.
Если вы используете другой URL, вы можете получить несколько маршрутов, каждый из которых состоит из нескольких шагов. Код по-прежнему будет обрабатывать первый этап первого маршрута, но каждый из них (с внешними циклами) будет отображать все из них (не показаны ниже).
Объяснение строки регулярного выражения '"~> ([A-Z]. *?) <~"' Заключается в следующем. </p>
'#'
с каждой стороны - это разделители 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;
}
?>