人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP,XMLについて質問です。

PHPで下記のようにdefineしています。
define('DOMAIN','http://q.hatena.ne.jp');

XMLが下記のようなものとします。
<datas>
<data>
<pic>
<![CDATA[
<a href="http://(中略)"><img src="/img/s55.jpg"/><BR>はてな</a>
]]>
</pic>
</data>
</datas>

この「/img/s55.jpg」を上記でdefineされてるURLと結合させて絶対パスにして、
「http://q.hatena.ne.jp/img/s55.jpg」とさせたいです。
「<img src="'. DOMAIN .'/img/s55.jpg"/>」などとやってみましたがうまくいきません。
どうしたらよいか教えて下さい。

念のため上記を活用するためのスクリプトは下記のとおりです。
function pic(){
$xxx = simplexml_load_file(DATA);
foreach($xxx -> data as $pics){
$picjpg .= $pics -> pic . '<br>';
}
return $picjpg;
}

Vista、PHP5、Firefoxという環境でやってます。
以上、よろしくお願いします。

●質問者: taroemon
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:.jpg AS CDATA firefox PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pahoo
●50ポイント

定数を、ヒアドキュメントの中で記述することはできません。

以下に代替策を示します。


いったん変数にする

<?php
define('DOMAIN', 'http://q.hatena.ne.jp');
$domain = DOMAIN; //いったん変数にする

$xml =<<< EOT
<datas>
<data>
<pic>
<![CDATA[ 
<a href="http://(中略)"><img src="{$domain}"/img/s55.jpg"/><BR>はてな</a>
]]>
</pic> 
</data>
</datas>

EOT;

echo $xml;
?>

なお、加工したXMLは標準出力のみと言うことであれば、下記のような方法もあります。

ヒアドキュメントを使わない方法

<?php
define('DOMAIN', 'http://q.hatena.ne.jp');
?>

<datas>
<data>
<pic>
<![CDATA[ 
<a href="http://(中略)"><img src="<?= DOMAIN ?>/img/s55.jpg"/><BR>はてな</a>
]]>
</pic> 
</data>
</datas>
◎質問者からの返答

いつもご回答ありがとうございます。


意図を汲んで代替案を提示していただきありがとうございます。

XMLデータをそのまま活用したかったので、後者で実行したところうまくいきました。


ただ、define('DOMAIN','http://q.hatena.ne.jp');とfunction pic()は同一ファイルで、

XMLだけ別ファイルの場合、うまくいきません。どうしたらよいのでしょうか?


質問文が不適切でした。本当に申し訳ありません。

引き続きご回答をお待ちしてます。


2 ● tezcello
●50ポイント
元々は「<img src="/img/s55.jpg"/>」と相対パスで記述しているものを
下記のように絶対パスで指定するというのを目的としています。
<img src="http://q.hatena.ne.jp/img/s55.jpg"/>

/img/s55.jpg は / (ルート)からの見た位置を示しているので、相対パスでは無く絶対パスなのでは?

/img/s55.jpg -> http://q.hatena.ne.jp/hoge/img/s55.jpg

のように変更したいのだと考える事にします。


 XMLデータの方で「<img src="<?= DOMAIN ?>/img/s55.jpg"/>」などと仕込みをしておいて...

ファイルを直接XMLオブジェクトにせず、いったん文字列として取り込み、必要部位を置換してからXMLオブジェクトとしてはいかがでしょう?

$src = file_get_contents(DATA);
$src = str_replace('<?= DOMAIN ?>', DOMAIN, $src);

// 当方の環境では、オプションなしだと CDATA はコメント扱いなのか取り出すことが出来ませんでした
//$xxx = simplexml_load_string($src);
$xxx = simplexml_load_string($src,'SimpleXMLElement',LIBXML_NOCDATA);

ですが、pic() を介してしかアクセスしないのなら、特に仕込みを入れなくても

function pic(){
 $xxx = simplexml_load_file(DATA); // 質問者さんの所ではこれでOK?
 foreach($xxx -> data as $pics){
 $picjpg .= $pics -> pic . '<br>';
 }
 $picjpg = str_replace('src="', 'src="'.DOMAIN, $picjpg);
 return $picjpg;
}

こんな事も可能かと思います。


XMLとして使うのなら、XMLファイルを作る時に valid XML document になるようにしておくのが筋のように思います。

(前の質問時は、この回答はお気に召さなかったみたいですが)

例えば、<br> を <br/>, <img ... > を <img ... /> のように空要素のタグを処理しておくとかすれば、href 属性値でも、src 属性値でも、取り出したり変更したりが簡単だったのでは?

< を &lt; ,> を &gt; に置き換える(htmlspecialchars() で一発ですね)だけでもよかったかも知れませんね。(戻すのも関数一発です)


valid XML document でないと、他で使う時も結局使い難いものなってしまいませんか?

単にPHPで処理するだけなら、XMLではなくてもただのテキストファイルでもいいですよね?

◎質問者からの返答

丁寧なご回答ありがとうございます。


>相対パスでは無く絶対パスなのでは?

勘違いをしていました。ご指摘ありがとうございます。


>単にPHPで処理するだけなら、XMLではなくてもただのテキストファイルでもいいですよね?

そう言われてみればそのとおりです。すっかり抜けてました。

いただいたご回答を元に処理していきます。


>valid XML document でないと、他で使う時も結局使い難いものなってしまいませんか?

恥ずかしい話なのですが、どういうものがvalidでそうでないかはまだ完璧にわかってません。

大変参考になりました。これから勉強していきます。


今後も質問しますのでまたいろいろ教えてください。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ