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という環境でやってます。
以上、よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/12/12 13:50:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント50pt

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

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


いったん変数にする

<?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>
id:taroemon

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


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

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


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

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


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

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

2008/12/11 00:42:38
id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ポイント50pt
元々は「<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ではなくてもただのテキストファイルでもいいですよね?

id:taroemon

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


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

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


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

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

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


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

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

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


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

2008/12/12 13:49:46
  • id:pahoo
    #1で回答した者です。
    プログラムの要件の確認をさせてください。

    1)ユーザー定義関数 pic でご質問にあるような XML ファイル(ファイル名 DATA)を読み込む。
    2)pic 内で img src に定数 DOMAIN を付加する。
    3)付加結果をXMLファイルとして保存する。(元のDATAに上書き保存でよいですか?)

    こういう動作をするプログラムを書きたいというご質問ですか?
  • id:taroemon
    pahooさん
    お問い合わせありがとうございます。

    ①そうです。

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

    ③付加結果をXMLデータ(ファイル名’DATA’)に保存しない方法でお願いします。
    XMLデータの方で「<img src="<?= DOMAIN ?>/img/s55.jpg"/>」などと仕込みをしておいて、
    別ファイルのPHPで処理した結果、「<img src="http://q.hatena.ne.jp/img/s55.jpg"/>」となると理想的です。
    ドメインが変わった時、PHP側の「define('DOMAIN','http://q.hatena.ne.jp');」を変えるだけで
    変更されるといいなという意図で質問しました。

    こんなことが本当にうまくいくかどうかわからないまま質問しました。
    もしそれが不可能でしたら「それは無理」とでもお答えいただければ幸いです。
    また、お時間があればぜひご回答ください。よろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません