2012-08-31 3 views
0

아래 파일은 XMP 데이터가있는 PhotoShop의 JPG 파일을 사용하여 설정할 수 있습니다. '패턴'에서 'eat :'을 'dc :'또는 '$ string'에서 반환 된 모든 네임 스페이스로 바꿉니다.배열에 호출 된 '문자열'이 왜 보이지 않습니까?

호출 $ 문자열 (1)처럼 보이는 print_r의 배열을 생성하는 다음과 같은 배열 설정을 사용 : (2)

당신이 라인 ubove (1A)를 주석을 해제하는 경우는 찾아보기로 인쇄 할 수는 & 붙여 넣기 복사를 (1a) 아래 줄에. 이것은 다음과 같은 배열을 생성해야합니다 : (3)

왜 그것이 동일한 문자열 일 때 print_r의 차이점이 있습니까?

(3)과 같이 작동하도록하려면 어떻게해야합니까? ... 그럼에도 불구하고 나는 그것을 (4)처럼 끝내게 할 수 있을까요?

<?php 
header("Content-Type: text/html; charset=utf-8"); 
$filename = "2012-04-24_WestCoast_2.jpg"; 
echo '<img src="'. $filename . '" alt="'. $filename . '" title="' .  $filename . '" width="350" /><p />'; 
$source = file_get_contents($filename); 
$xmpdata_start = strpos($source,'<x:xmpmeta'); 
$xmpdata_end = strpos($source,"</rdf:Description>"); 
$xmplenght = $xmpdata_end-$xmpdata_start; 
$xmpdata = substr($source,$xmpdata_start,$xmplenght+18); 
$string = htmlentities($xmpdata); //(1) 

//if (is_string($string)) { 
// echo "is a string\n"; //TRUE 
//} else { 
// echo "is not a string\n"; 
//} 

//$string = print_r("'".$string."';"); 
// (1a)===================================== 
//$string = '<x:xmpmeta xmlns: === Truncated for simplicity ===x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"></rdf:Description>'; 

$pattern = '/eat:(.*?)="(.*?)"/is'; 
preg_match_all($pattern, $string, $matches); 
$group = array($matches[1], $matches[2]); 
// foreach($group as &$match); 
echo '<pre>'; 
// print_r ($match); 
print_r ($group); 
echo '</pre>'; 
?> 

(2) =====================================
/난 그냥 '$ 문자열을'호출 할 경우 /이 내가 무엇을 얻을 수 있습니다 :

Array 
(
    [0] => Array 
     (
     ) 

    [1] => Array 
     (
     ) 

) 

(3) ======================= ==============
// 나는 주석을 해제하는 경우 (1), I는 파일 내부에 붙여 넣은 '$ 문자열은'나는이 얻을 :

Array 
(
    [0] => Array 
     (
      [0] => Biography 
      [1] => Title 
      [2] => object_description 
      [3] => Medium 
      [4] => in_height 
      [5] => in_width 
      [6] => in_depth 
      [7] => Dated 
      [8] => Photograph 
     ) 

    [1] => Array 
     (
      [0] => American B1942 Castine, Maine 
      [1] => Reunion Dinner Party at the Slanted Door 
      [2] => Nancy Freeman, Tim Patterson The Slanted Door San Francisco Calf. 
      [3] => photography 
      [4] => 2736 
      [5] => 3648 
      [6] => @ 240 dpi 
      [7] => April 24, 2012 
      [8] => PrimaryImage 
     ) 

) 

(4) ================ =====================
이 내가 너무 얻기 위해 노력하고있어입니다 // :

Biography: American B1942 Castine, Maine 
Title: Reunion Dinner Party at the Slanted Door 
object_description: Reunion Dinner Party at the Slanted Door 
Nancy Freeman, Tim Patterson The Slanted Door San Francisco Calf. 
Medium: photography 
in_height: 2736 
in_width: 3648 
in_depth: @ 240 dpi 
Dated: April 24, 2012 
Photograph: PrimaryImage 
+0

문자열이 파일 내부 또는 외부에 설정된 경우의 차이점에 대한 의미를 정리할 수 있습니까? 또한 정규 표현식의 결과를 병합 할 수있는 해결책에 대한 내 대답을 참조하십시오. – RMDan

+0

(3)의 주석 설명을 다음과 같이 수정했습니다. "/ 주석을 제거한 경우 (1) 파일에 붙여 넣은 '$ 문자열'은 다음과 같습니다." –

+0

BTW $ group은 $ 패턴. –

답변

0

글쎄, "왜 배열에서 보이지 않는 '문자열'이라고 불리는가?라는 내 자신의 질문에 대답하는 것처럼 보입니다." 대답은 'htmlentities()'호출이 선행 된 경우입니다.

이제는 왜 그런 일이 일어나는 지 잘 모르겠지만 순간적으로 돌아가서 모든 가정을 점검했습니다. 'htmlentities()'는 원시 문자열을 정리합니다. 'htmlentities()'를 주석 처리하면 모든 것이 작동합니다.

이것은 버그입니까? 저는 개인적으로 모릅니다. 그리고 PHP를 사용하여 추측을 위험하게 만드는 데 필요한 경험이 없습니다. 내가 아는 한 일주일 동안 나를 벽에 태워 버렸다.

0

내가 무엇에 명확하지 않다 문제는 파일 내부 또는 외부에서 문자열을 설정하는 것입니다. 설명하려고하는 것이 명확하지 않습니다.

배열 (3)의 출력은 정규식의 대괄호로 인해 발생합니다. 정확한 이유를 모르겠지만 원하는 결과를 얻으려면 (4) 새 배열의 두 배열을 결합하는 루프를 사용할 수 있습니다.

참고 : $ group을 (를) 사용하면 배열 배열을 만드는 것입니다. 두 배열을 하나로 병합하지 않습니다. 배열을 병합하려면 두 배열을 반복하고 각 요소를 새 배열의 새 요소로 병합해야합니다.

예 :

for($i=0; $i<match[0].length; $i++){ 
    $result[i] = $match[0][i]. ": " .$match[1][i]; 
} 
내 PHP에

임 녹슨하지만, 그 배열을 병합에 대한 생각이다.

--EDIT--

지금 나는 당신이 문제가 발생할 수 있습니다 어디 두 가지 장소를 볼 뭘 하려는지 이해. 우선, 사용하고있는 이미지에 원하는 필드의 메타 데이터가 100 % 확실한가? 메신저 데이터의 정확한 특성에 대해서는 확신 할 수 없지만, 컴퓨터가 설정 한 필수 데이터 (시작 지점과 끝 지점으로 필터링 한 데이터)와 사용자 지정 데이터가 있다는 것을 알고 있습니다. 비어있는 경우 포함되지 않을 수도 있습니다.

두 번째 가능한 문제는 메타 데이터를 어떻게 합치는지입니다. 어쩌면 문자열에서 시작과 끝을 제거하기 위해 정규 표현식을 쓰는 것이 좋습니다. 문자 세트 앞에있는 모든 것을 ""로 바꾸고 뒤에 대해서도 비슷한 표현을하십시오.

또한 $ group에 설정 한 변수는 $ match와 완전히 똑같습니다. 배열 %에 포함 된 두 배열을 가져 와서 $ group 배열에 할당했습니다. 단지 FYI. 이전에 게시 한 sudo 코드를 사용하여 실제로 두 어레이를 하나로 결합하는 루프를 설계하십시오.

행운을 비네. 어쩌면 내가 PHP를 테스트 컴퓨터에 설치했을 때 정확히 무슨 일이 일어나는지 코드를 가지고 놀아 보겠다.

+0

감사합니다 RMDan, 내 파일에 몇 가지 설명을 추가하여 두 사람이 내가 한 일을 잘 설명해주었습니다. 일단 내가 배열의 포맷이되면, for 루프가 작동 할 수도 있지만,이 시점에서는 그렇지 않습니다. –

+0

나는 당신의 변화를 살펴 보았고, 지금 당신이하려고하는 것을 봅니다. 이번에 올바르게 읽으면 이미지에서 메타 데이터를 제거하여 다른 곳에서 사용할 수 있습니다. 내가 잘못하면 내 편집이별로 유용하지 않을 수도 있습니다. – RMDan

관련 문제