Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP在两个字符串之间提取数据_Php_Regex - Fatal编程技术网

用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 )