用PHP在两个字符串之间提取数据
我有以下字符串:用PHP在两个字符串之间提取数据,php,regex,Php,Regex,我有以下字符串: $html = '"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"'; 我想提取lat和lng数据 这是我的尝试: $lat = preg_match_all('#lat":"(.*?)","lng#', $html, $matches); $lat = matches[1]; 但它不起作用 你能帮帮我吗 谢谢。此表达式可能会提取此捕获组中所需的纬度和经度数据(.+?),因为它还
$html = '"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"';
我想提取lat
和lng
数据
这是我的尝试:
$lat = preg_match_all('#lat":"(.*?)","lng#', $html, $matches);
$lat = matches[1];
但它不起作用
你能帮帮我吗
谢谢。此表达式可能会提取此捕获组中所需的纬度和经度数据
(.+?)
,因为它还删除了不需要的空格:
("lat":|"lng":)"\s*(.+?)\s*"
试验
输出
json_decode
比regex可靠得多。为缺少的“address”
元素添加大括号和值,您可以直接索引到结果中:
<?php
$html = '"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"';
$decoded = json_decode('{'.$html.':""}', true);
echo "lat: ".$decoded["lat"]." lng: ".$decoded["lng"];
“lat”:“\s*([^”]*?\s*”,“lng”:“\s*([^”]*?\s*)”\K
第1组和第2组中的值
Php代码
…这看起来像一个JSON字符串。为什么需要正则表达式?部分/截断的JSON字符串。如果可以使用
{}
保留完整的结构,那么正如达曼所说,解析将是理想的。另外,这个问题的标题让我强烈地想起了中的例子。@Dharman,我的$html
,只是文件\u get\u contents()
结果的简单版本。你在读什么文件?文件里有什么?您是如何在变量中获得该文件格式不正确的部分的?如果完整内容是JSON资源,那么-或者对于一个文件-为什么要在解码期间创建一个新属性root
,然后访问它?你可以直接解码吗?谢谢你的帮助。它是有效的,但正如我在评论中解释的,我的$html
,只是一个文件的结果的一个简单版本。
。我像这样集成它:preg\u match\u all(''lat:':“\s*([^”]*?\s*”,'lng:“\s*([^”]*?\s*)“\K',$html,$latlng);回显“Lat为”。$latlng[0]代码>?@popo-您正在匹配一对,一个坐标。你想怎么做就怎么做<代码>[[lat,long],[lat,long],,][/code>这样:echo$latlng[lat,long]
?@popol-是的,像echo“(lat,long)=(“$latlng[$i][1]”,“$latlng[$i][2]”\n”代码>@popol-只是给你一个警告。如果你不成对配对,你将错过一个(这不是If),你将没有可行的坐标。您好,谢谢您的帮助。如果我只需要$lat
我是否需要使用foreach
?如果您只需要一个并且必须使用正则表达式,请使用preg_match
并从正则表达式模式中删除lng
替代项。
45.491834
-73.606953
<?php
$html = '"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"';
$decoded = json_decode('{'.$html.':""}', true);
echo "lat: ".$decoded["lat"]." lng: ".$decoded["lng"];
lat: 45.491834 lng: -73.606953
<?php
$str = '
"id":75549,"name":"Name","lat":"45.491834","lng":" -73.606953","address"
"id":75550,"name":"Name","lat":"44.491834","lng":" -72.606953","address"
"id":75551,"name":"Name","lat":"43.491834","lng":" -71.606953","address"
';
$cnt = preg_match_all('/"lat":"\s*([^"]*?\s*)","lng":"\s*([^"]*?\s*)"\K/', $str, $latlng, PREG_SET_ORDER );
if ( $cnt > 0 )
{
// print_r ( $latlng );
for ( $i = 0; $i < $cnt; $i++ )
{
echo "( lat, long ) = ( " . $latlng[$i][1] . ", " . $latlng[$i][2] . " )\n";
}
}
>
( lat, long ) = ( 45.491834, -73.606953 )
( lat, long ) = ( 44.491834, -72.606953 )
( lat, long ) = ( 43.491834, -71.606953 )