Не могу получить простой текст Google Maps API HTML5 инструкции в PHP - PullRequest
0 голосов
/ 28 августа 2018

Я стараюсь изо всех сил, чтобы получить простой текст из API карт Google Maps, где он говорит html_instructions в json. все закодировано в html, и я хочу вывести простой текст.

вот что я получаю изображение 1

это то, что я хочу: изображение 2

Я пробовал любой тип preg_replace, он не мог мне помочь.

Google Maps API-ссылка Ссылка

1 Ответ

0 голосов
/ 28 августа 2018

РЕДАКТИРОВАТЬ: Предыдущий фрагмент кода удален и заменен работоспособной небольшой программой.

Обратите внимание, что при обработке данных с помощью 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; 

} 
?>
...