无法在 php 中获取纯文本 google 映射 api html_instructions

Can't get plain text google maps api html_instructions in php

我正在尽力从 google 地图方向 api 获取纯文本,其中 json 中显示 html_instructions。一切都在 html 中编码,我想输出纯文本。

这是我得到的 image 1

这就是我想要的:image 2

我尝试了 preg_replace 的一种类型,它无法帮助我。

Google 地图 api link Link

编辑: 之前的代码片段被删除并替换为可用的小程序。

请注意,当您使用 json_decode() 处理数据时,\u003cb\u003eFlintergata\u003c/b\u003e 等 unicode 段将转换为 <b>Flintergata</b>。这有助于使正则表达式更具可读性。

注意$details数组是一个多级关联数组,因此您需要如图所示向下挖掘以找到您需要的数据。

另请注意 URL 您在 1 条路线和 1 条航程中提供的结果。所以我提供的代码显示并处理了第一条路线的第一段。

如果您使用不同的 URL,您可能会得到多条路线,每条路线都有多个步骤。该代码仍将处理第一条路线的第一段,但它的每个(带有外部循环)显示所有这些(下面未显示)。

正则字符串'"~>([A-Z].*?)<~"'的解释如下

每边的 '#' 是 PHP 分隔符 - 但您也可以使用其他字符,不会有任何区别。

<b></b> 表示每个匹配的字符串必须以 <b> 开头并以 </b> 结尾。

( ) 里面有一个 "capture group" 表示我们只想提取字符串的那部分(不包括 <b></b>)。

[A-Z]表示以大写字母开头

.* 表示跟随任何字符的 0 个或多个。

? 使得 * non_greedy 所以这种情况下,当遇到下一个 < 时停止当前匹配。

每个字符串的匹配列表进入一个名为 $matches 的数组,$matches[1] 是一个捕获组匹配数组(即 <b> 和 [=16= 中的文本] 已删除)。

<?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; 

} 
?>