无法在 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;
}
?>
我正在尽力从 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;
}
?>