Shell响应中的字符串搜索

时间:2018-09-15 21:29:14

标签: php string shell

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

这是代码:

$path = getcwd();    
$metadata = shell_exec("exiftool ".$target_file);
echo $metadata;

Shell响应: 我只想从中读取并返回“ GPS经度:29度44'23.10”“ E”。

response

ExifTool Version Number : 11.10 File Name : tree.jpg Directory : uploads File Size : 275 kB File Modification Date/Time : 2018:09:15 14:13:45-07:00 File Access Date/Time : 2018:09:15 14:13:45-07:00 File Creation Date/Time : 2018:09:15 14:13:45-07:00 File Permissions : rw-rw-rw- File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg Exif Byte Order : Little-endian (Intel, II) Make : Nokia Camera Model Name : C5-00.2 Orientation : Horizontal (normal) X Resolution : 300 Y Resolution : 300 Resolution Unit : inches Y Cb Cr Positioning : Centered Warning : Suspicious ExifIFD offset for ExposureTime F Number : 2.4 ISO : 100 Exif Version : . Date/Time Original : Create Date : 8 Components Configuration : Y, Cb, Cr, - Shutter Speed Value : 1/142 Aperture Value : 1.6 Light Source : Unknown Flash : Off, Did not fire Focal Length : 3.4 mm Sub Sec Time : 478 Sub Sec Time Original : 478 Sub Sec Time Digitized : 478 Flashpix Version : . Color Space : sRGB Exif Image Width : 1024 Exif Image Height : 768 Custom Rendered : Normal Exposure Mode : Auto White Balance : Auto Digital Zoom Ratio : 0.005786590576 Scene Capture Type : Standard Gain Control : None GPS Version ID : 8704 GPS Latitude Ref : North GPS Longitude Ref : East GPS Altitude Ref : Above Sea Level Compression : JPEG (old-style) Thumbnail Offset : 13818 Thumbnail Length : 14279 Image Width : 1024 Image Height : 768 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Aperture : 2.4 GPS Altitude : 50.4 m Above Sea Level GPS Longitude : 29 deg 44' 23.10" E Image Size : 1024x768 Megapixels : 0.786 Shutter Speed : 1/142 Thumbnail Image : (Binary data 14279 bytes, use -b option to extract) Focal Length : 3.4 mm Light Value : 9.7

谢谢。

3 个答案:

答案 0 :(得分:1)

我制作了一个较小的字符串以显示操作。

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.*" .'

答案 1 :(得分:0)

我不确定您希望它如何工作,但是如果字符串中始终存在“ GPS经度”,则可以explode()并进行遍历以查找要查找的字段。

$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;
  }
}

这是硬编码方式,但是如果元数据以换行符分隔的每个属性出现,则可以更改。老实说,这是一种可怕的方式,但是我没有什么可做的。

答案 2 :(得分:0)

无论如何:

#-- 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 
    ...
)