2015-09-02 2 views
2

Я пытаюсь извлечь все Имена изображений и их пути из загруженного файла. Я ищу правильное регулярное выражение.Регулярное выражение для получения имени изображения из файла

Строка массивен, но раздел будет выглядеть следующим образом:

..... [{\ "имя \": \ "Aluminum_Black_mat \", \ "ид \": \ "b3281b09- 88be-4e9b-9fc2-514cbaae0a0e \», \ "backFaceCulling \": правда, \ "каркасный \" ложь \ "окружающей среды \": [0.0,0.0,0.0], \ "диффузный \": [1.0,1.0 , 1,0], \ "зеркальным \": [0.0,0.0,0.0], \ "эмиссионная \": [0.0,0.0,0.0], \ "specularPower \": 2,56, \ "альфа \": 1,0, \» diffuseTexture \ ": {\" имя \ ": \" BlackRailing.jpg \», \ "уровень \": 1.0, \ "hasAlpha \": ложь, \ "getAlphaFromRGB \": ложь, \ "coordinatesMode \": 0 \ "isCube \" ложь \ "uOffset \": 0,0, \ "Voffset \": 0,0, \ "uScale \": 1.0, \ "vScale \": 1.0, \ "Uang \": 0,0, \ "Ванг \": 0,0, \ "Ван \": 0,0, \ "wrapU \": 1, \ "wrapV \": 1, \ "coordinatesIndex \": 0, \ "isRenderTarget \" ложь \ "renderTargetSize \ ": 0, \" mirrorPlane \ ": нулевой, \" жэнь derList \ ": null, \" animations \ ": []}, \" diffuseFresnelParameters \ .... ETC

В этой строке есть BlackRailing.jpg. Это то, что мне нужно получить. Если бы у меня был путь, я тоже хотел бы получить это. Баснически все между этими цитатами и только если это образ. Я некоторое время набрасывался на http://www.regexr.com/, и я не могу заставить его идеально сочетаться. И когда я запускаю следующее, я всегда получаю все до первой цитаты.

preg_match_all('/[ :]".*.(jpe?g|png|bmp)/i', $buffer, $matches); 

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

Спасибо!

+6

Выглядит потенциально как JSON. Почему бы не попробовать декодировать строку, а затем вытащить соответствующие данные из объекта/массива? –

+2

Попробуйте 'preg_match_all ('/: \\?" ([^ "] * \. (?: jpe? G | png | bmp))/i', $ str, $ matches); print_r ($ матчей [1]); '. Но поскольку это, скорее всего, JSON, я бы предложил использовать парсер JSON. –

+0

Это файл JSON, но файл может находиться в пределах 5-500 мб. Я не уверен, что разумно, чтобы сервер сохранил все это как переменную. В настоящее время я просто разбираюсь по очереди, ища имена файлов. @stribizhev, который почти работал, я удалил первый \\, поскольку я понял, что все кавычки экранированы, и они не должны быть такими, какими они не являются в файле ... теперь мой массив прибывает как: [": \" BlackRailing .jpg "," BlackRailing.jpg "] .. Любой способ удалить: \" от первого и только иметь именно это? В настоящее время используется 'preg_match ('/ :?" ([^ "] * \. (?: jpe? G | png | bmp))/i', $ buffer, $ matches);' –

ответ

3

Как вы относитесь к JSON-файл в виде текстового файла, вы можете использовать preg_replace подход, как этот при условии, что нет пробелов между : и значением:

preg_match('/(?<=:")[^"]*\.(?:jpe?g|png|bmp)/i', $buffer, $matches); 

См regex demo

(?<=:") look-behind проверяет только на :", но не фиксирует его.

Примечание, если у вас есть одно пространство-между : и ", вы можете использовать '/(?<=:[ ]")[^"]*\.(?:jpe?g|png|bmp)/i' регулярное выражение, но если там может быть больше, вы будете нуждаться в отлов групповой подход.

+0

спасибо.Я был удивлен, что я мог бы preg_match весь файл, даже если он был таким большим, json_decoding он помещал ошибку из памяти. Не регрессировав, вы решили работать и спасибо :) –

+1

Рад, что это сработало, пожалуйста, также подумайте о том, чтобы продолжить, если мой ответ окажется вам полезен. [См. Как повысить уровень переполнения стека?] (Http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow) –

Смежные вопросы