下面的文件可以使用PhotoShop中具有XMP数据的任何JPG文件进行设置。在'pattern'中,将'eat:'替换为'dc:'或从'$ string'返回的任何命名空间。
使用以下数组设置调用$ 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)=====================================
//如果我只是调用'$ 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
答案 0 :(得分:0)
我不清楚文件内部或外部设置的字符串是什么问题。目前还不清楚你要解释的是什么。
数组(3)的输出是由正则表达式中的括号引起的。我不知道确切的原因,但是要获得你想要的结果(4)你可以使用一个循环来连接一个新数组中的两个数组。
注意:你使用$ group做的是制作数组数组。您没有将两个阵列合并为一个。要合并数组,您需要遍历两个数组并将每个元素合并为新数组的新元素。
示例:
for($i=0; $i<match[0].length; $i++){
$result[i] = $match[0][i]. ": " .$match[1][i];
}
我的php生锈了,但这是合并数组的想法。
- 编辑 -
既然我明白你要做什么,我会看到两个可能出现问题的地方。首先是:您是否100%确定您使用的图像包含您想要的字段中的任何元数据?我不确定元数据的确切性质,但我知道计算机将会设置所需的数据(使用起点和终点过滤掉的内容)以及自定义数据。如果是空白,甚至可能不包括在内。
第二个可能的问题是你如何分块元数据。也许尝试写入正则表达式来剥离字符串的开头和结尾。用“”替换一组字符前面的所有内容,并为后面做一个类似的表达。
您为$ group设置的变量与$ match完全相同。您将数组%中包含的两个数组匹配,并将它们分配给名为$ group的数组。只是一个FYI。使用我之前发布的sudo代码来设计实际将两个数组合并为一个的循环。
祝你好运。也许当我在测试计算机上设置php时,我将使用代码来查看究竟发生了什么。答案 1 :(得分:0)
好吧,看起来我可以回答我自己的问题&#34;为什么它是一个被叫的字符串&#39;数组不可见?&#34;。 答案是:在拨打&#39; htmlentities()&#39;之前。
现在我不确定为什么会这样,但确实发生了,我回过头来检查了所有我的假设...&#39; htmlentities()&#39;会清理原始字符串。评论&#39; htmlentities()&#39;让一切顺利。
这是一个错误吗?我个人不知道,并且我没有使用PHP的必要经验甚至冒险猜测。我所知道的是它让我上了一个星期。