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という環境でやってます。
以上、よろしくお願いします。
定数を、ヒアドキュメントの中で記述することはできません。
以下に代替策を示します。
<?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>
元々は「<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 属性値でも、取り出したり変更したりが簡単だったのでは?
< を < ,> を > に置き換える(htmlspecialchars() で一発ですね)だけでもよかったかも知れませんね。(戻すのも関数一発です)
valid XML document でないと、他で使う時も結局使い難いものなってしまいませんか?
単にPHPで処理するだけなら、XMLではなくてもただのテキストファイルでもいいですよね?
丁寧なご回答ありがとうございます。
>相対パスでは無く絶対パスなのでは?
勘違いをしていました。ご指摘ありがとうございます。
>単にPHPで処理するだけなら、XMLではなくてもただのテキストファイルでもいいですよね?
そう言われてみればそのとおりです。すっかり抜けてました。
いただいたご回答を元に処理していきます。
>valid XML document でないと、他で使う時も結局使い難いものなってしまいませんか?
恥ずかしい話なのですが、どういうものがvalidでそうでないかはまだ完璧にわかってません。
大変参考になりました。これから勉強していきます。
今後も質問しますのでまたいろいろ教えてください。
いつもご回答ありがとうございます。
意図を汲んで代替案を提示していただきありがとうございます。
XMLデータをそのまま活用したかったので、後者で実行したところうまくいきました。
ただ、define('DOMAIN','http://q.hatena.ne.jp');とfunction pic()は同一ファイルで、
XMLだけ別ファイルの場合、うまくいきません。どうしたらよいのでしょうか?
質問文が不適切でした。本当に申し訳ありません。
引き続きご回答をお待ちしてます。