Php Shell响应中的字符串搜索

Php Shell响应中的字符串搜索,php,string,shell,Php,String,Shell,我只是一个小应用程序的初学者,在这个小应用程序中,用户上传图像,它会触发一些exiftool,从这些图像中提取并返回元数据。 我感兴趣的是从该响应中仅提取GPS位置信息,即仅提取纬度和经度值。目前,我将元数据存储在一个变量中,并将其回显出来。我有点被Php中的字符串搜索所困扰,或者可能直接从shell响应中读取 以下是代码: $path = getcwd(); $metadata = shell_exec("exiftool ".$target_file); echo $metadata

我只是一个小应用程序的初学者,在这个小应用程序中,用户上传图像,它会触发一些exiftool,从这些图像中提取并返回元数据。 我感兴趣的是从该响应中仅提取GPS位置信息,即仅提取纬度和经度值。目前,我将元数据存储在一个变量中,并将其回显出来。我有点被Php中的字符串搜索所困扰,或者可能直接从shell响应中读取

以下是代码:

$path = getcwd();    
$metadata = shell_exec("exiftool ".$target_file);
echo $metadata;
外壳响应: 我只想从中读取并返回“GPS经度:29度44'23.10”E”


提前感谢。

我不确定您希望它如何工作,但如果“GPS经度”始终在字符串中,您可以分解()并迭代以找到您要查找的字段

$exploded_string = explode(" ", $metadata);
$size_exploded = count(exploded_string); //or you could use sizeof()
$gps_long = "";

for ($i = 0; $i < $size_exploded; $i++){
  if (($exploded_string[$i] == "GPS") && ($exploded_string[$i+1] == "Longitude")){
    $gps_long = array_slice($exploded_string, $i, 8); //this will have the longitude
    break;
  }
}
$exploded\u string=explode(“,$metadata”);
$size\u exploded=count(exploded\u string);//或者您可以使用sizeof()
$gps_long=“”;
对于($i=0;$i<$size\u;$i++){
如果($exploded_字符串[$i]==“GPS”)&($exploded_字符串[$i+1]==“经度”)){
$gps_long=array_slice($i,8);//这将有经度
打破
}
}

这是硬编码的方式,但是如果元数据出来时每个属性都是换行分隔的,那么这可能会被更改。老实说,这是一种可怕的方式,但我没有太多的东西要做。

我制作了一个较小的字符串来显示要做什么

str="Above Sea Level GPS Longitude : 29 deg 44' 23.10\" E Image Size :"
# Think about what makes your substring
echo "${str}"| sed -r 's/.*(GPS Longitude.*" .).*/\1/'
# or
echo "${str}"| grep -Eo 'GPS Longitude.*" .'
无论如何:

#-- split key:value fields from shell output
$text = implode("\n", $result);     # array to string
preg_match_all("/^ 
      (\w.+?)                   # label
      \s*:\s*                   # :
      (.+) \s*                  # value
    $/mix", $text, $matches
);
$map = array_combine($matches[1], $matches[2]);  # key=>value
print_r($map);
收益率:

Array
(
    [ExifTool Version Number] => 11.10
    [File Name] => tree.jpg
    [Directory] => uploads 
    ...
)

将$metadata变量的var_dump附加到问题,please@MaximFedorov请查找。您可以读取每行的输出,并检查行是否以
GPS经度
开头,或者编写一些正则表达式,检查
GPS经度
是否出现,然后读取行的其余部分,即读取内容直到
\n
character您是否看到
echo$metadata
echo“$metadata之间的区别“
?当输出有类似换行符的内容时,需要最后一行。图像以不同的行显示输出,粘贴的字符串没有。你有换行符吗?你复制粘贴我的代码了吗?我的代码不工作了吗?您的
sed
是否支持
-r
和您的grep
-o
?只需使用
sed
,它将值得您花费时间。也许从更简单(效率更低)的sed's/*GPS/GPS/'| sed's/Image.*/'是的,我只是想看看输出。另请参见shell响应存储在$metadata变量中。有没有可能在从shell获取响应时,我们只获取GPS经度和纬度值(如果它们存在的话)。(我们以前在某个地方有过这个确切的问题和代码。但也不必麻烦用谷歌搜索它。)另外:
exiftool*jpeg-j
用于JSON输出,顺便说一句。
Array
(
    [ExifTool Version Number] => 11.10
    [File Name] => tree.jpg
    [Directory] => uploads 
    ...
)