0

以下のファイルは、XMPデータを含むPhotoShopの任意のJPGファイルを使用してセットアップできます。'pattern'で、'eat:'を'dc:'または'$string'から返された名前空間に置き換えます。

次の配列設定を使用して$string(1)を呼び出すと、次のようなprint_r配列が生成されます。(2)

上の行(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)=====================================
//'$stringを呼び出すだけの場合'、これは私が得るものです:

Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
        )

)

(3)=====================================
//(1)のコメントを外すと、ファイル内に貼り付けた「$string」、これを取得します:

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
4

2 に答える 2

0

文字列がファイルの内側または外側に設定されている問題が何であるかはわかりません。あなたが何を説明しようとしているのかは不明です。

array(3)の出力は、正規表現の角かっこによって発生します。これの正確な理由はわかりませんが、必要な結果を得るには(4)、ループを使用して2つの配列を新しい配列に結合することができます。

注:$ groupで行うことは、配列の配列を作成することです。2つのアレイを1つにマージしていません。配列をマージするには、両方の配列を反復処理し、各要素を新しい配列の新しい要素としてマージする必要があります。

例:

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

私のphpはさびていますが、それは配列をマージするためのアイデアです。

- 編集 -

あなたが何をしようとしているのか理解できたので、問題が発生する可能性のある場所が2つあります。1つ目は、使用している画像のフィールドにメタデータが含まれていることを100%確信していますか?メタデータの正確な性質はわかりませんが、コンピューターによって必要なデータセット(開始点と終了点でフィルターで除外したもの)とカスタムデータがあることは知っています。空白の場合、含まれていない可能性もあります。

2番目に考えられる問題は、メタデータをどのようにチャンク化するかです。正規表現に書き込んで、文字列から開始と終了を削除してみてください。文字セットの前のすべてを「」に置き換え、後ろにも同様の表現を行います。

また、$ groupに設定した変数は、$matchとまったく同じものです。配列%matchに含まれている2つの配列を取得し、それらを$groupという配列に割り当てました。参考までに。以前に投稿したsudoコードを使用して、2つの配列を実際に1つに結合するループを設計します。

幸運を。たぶん、テスト用コンピューターでphpをセットアップしたら、コードを試して、正確に何が起こっているのかを確認します。

于 2012-08-31T17:08:38.990 に答える
0

「配列から見えない「文字列」と呼ばれるのはなぜですか?」という自分の質問に答えられるようです。答えは次のとおりです。「htmlentities()」の呼び出しが前にある場合。

なぜそれが起こるのかよくわかりませんが、実際に起こり、戻ってすべての仮定を確認した瞬間に...'htmlentities()'が生の文字列をクリーンアップします。'htmlentities()'をコメントアウトすると、すべてが機能しました。

これはバグですか?私は個人的には知りませんし、推測を危険にさらすためにPHPを使用するために必要な経験もありません。私が知っていることは、それが私を一週間壁に押し上げたということです。

于 2012-09-06T13:42:15.357 に答える