Поиск строки в ответе Shell - PullRequest
0 голосов
/ 16 сентября 2018

Я только начинающий, работающий над небольшим приложением, куда пользователь загружает изображения, и он запускает некоторый exiftool, который извлекает и возвращает метаданные из этих изображений. Я заинтересован в том, чтобы извлечь из этого ответа только информацию о местоположении GPS, то есть только значения широты и долготы. В настоящее время я храню метаданные в переменной и выводю их. Я как бы застрял с поиском этой строки в Php или, возможно, непосредственно читаю из ответа оболочки.

Вот код:

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

Shell Response: Я просто хочу прочитать и вернуть "Долгота GPS: 29 град. 44 '23,10" E "из него.

ответ

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 голосов
/ 16 сентября 2018

Я сделал строку поменьше, чтобы показать, что делать.

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.*" .'
0 голосов
/ 18 сентября 2018

В любом случае:

#-- 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 
    ...
)
0 голосов
/ 16 сентября 2018

Я не уверен, как вы хотите, чтобы он работал, но если в строке всегда указывается «Долгота 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;
  }
}

Это жестко закодированный способ, но если метаданные появляются с разделением новой строки каждым атрибутом, это можно изменить.Честно говоря, это ужасный способ сделать это, но мне не от чего избавиться.

...