Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
XMLのデーターを変換 - PHPプロ!Q&A掲示板
[go: Go Back, main page]

<< 携帯にhtmlメール 質問一覧 PHP+mysqlの日本語文字の取り扱いにつ... >>

  • 募集中!! 0P
XMLのデーターを変換

前回質問させてもらったものですが、また躓いてしまったので質問させてください。

PHP Version 4.4.6

今Flashでフォームを作成しています。
XMLでデータを読み込んで画像などを表示させています。
フォームの値をPHP側で受け取っているのですが、XMLデータのテンプレート部分(?)をPHP側で受け取った値に変更してメール送信したいのですが、どうしてもわかりません。質問がヘタクソで申し訳ないですがソースを書いておきますの宜しくお願いします。

data.xml

  1. <txt name="emailMessage"><![CDATA[Dear ==RECIPIENT_NAME==,
  2. ==SENDER_NAME== (==SENDER_EMAIL==) has sent you a ==CARD_NAME==.
  3. To view it, click the link below:
  4.       
  5. ==CARD_LINK==
  6.                       
  7. When you're done looking, check out ==WEBSITE_LINK== for news, videos, photos and tons of exclusives. 
  8. ==SENDER_NAME==                      
  9.                       
  10. http://==WEBSITE_LINK==]]></txt>

PHP側でXMLのデーターを読み込み上の「==RECIPIENT_NAME==」等の箇所を変換したいのです。
宜しくお願いします。
QXMLのデーターを変換 soulsurvivores  [09月24日 17時48分] NEW!
┗Re:XMLのデーターを変換 tezcello  [09月24日 22時10分] NEW!
  ┗Re:Re:XMLのデーターを変換 soulsurvivores  [09月24日 22時40分] NEW!
    ┣Re:Re:Re:XMLのデーターを変換 tezcello  [09月24日 23時45分] NEW!
    ┃┗Re:Re:Re:Re:XMLのデーターを変換 soulsurvivores  [09月25日 02時11分] NEW!
    ┗Re:Re:Re:XMLのデーターを変換 tezcello  [09月25日 09時32分] NEW!
      ┗Re:Re:Re:Re:XMLのデーターを変換 soulsurvivores  [09月25日 10時17分] NEW!
        ┗Re:Re:Re:Re:Re:XMLのデーターを変換 tezcello  [09月25日 13時25分] NEW!

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:XMLのデーターを変換

何となく文面がスパムメールのような感じがするのが気になりますが...

PHP での文字列の置き換え方がわからないという質問だと解釈しています。
間違っていたらご指摘ください。

data.xml の内容が、質問文に載っているので全部だとは思えない(xml になっていない)ので、CDATA 部がすでに抽出済みであると仮定してサンプルを書きます。
  1. // $str は抽出済みの CDATA 部の文字列
  2. $str = <<<EOL
  3. Dear ==RECIPIENT_NAME==,
  4. ==SENDER_NAME== (==SENDER_EMAIL==) has sent you a ==CARD_NAME==.
  5. To view it, click the link below:
  6.       
  7. ==CARD_LINK==
  8.                       
  9. When you're done looking, check out ==WEBSITE_LINK== for news, videos, photos and tons of exclusives. 
  10. ==SENDER_NAME==                      
  11.                       
  12. http://==WEBSITE_LINK==
  13. EOL;
  14.  
  15. // 置き換えるべき値の入っている配列を用意する
  16. // foreach で回したかったから配列にしただけ
  17. $var = array(
  18.   'RECIPIENT_NAME'=>'宛先',
  19.   'SENDER_NAME'=>'送信者名',
  20.   'SENDER_EMAIL'=>'foo@hoge.com',
  21.   'CARD_NAME'=>'カード名',
  22.   'CARD_LINK'=>'http://www.hoge.com/card/',
  23.   'WEBSITE_LINK'=>'www.hoge.com/'
  24.   );
  25.  
  26. foreach ($var as $k=>$v){
  27.   $aftr = preg_replace('/=='.$k.'==/', $v, $str);
  28. }

置き換え結果 $aftr は
  1. Dear 宛先,
  2. 送信者名 (foo@hoge.com) has sent you a カード名.
  3. To view it, click the link below:
  4.       
  5. http://www.hoge.com/card/
  6.                       
  7. When you're done looking, check out http://www.hoge.com/ for news, videos, photos and tons of exclusives. 
  8. 送信者名                      
  9.                       
  10. http://www.hoge.com/

Re:Re:XMLのデーターを変換

tezcelloさん、返信ありがとうございます。
スパムメールではありませんが、変な誤解をさせてしまい申し訳ありませんでした。

data.xml の内容の全文は
  1. <xmasCard>
  2.   <colors site_col1="0x000000" bg_col="0xFFFFFF" site_col2="0xed1c24"/>
  3.   <links name="links" baseURL="**.com">  
  4.     <link name="siteBrandImage">images/brand.png</link>
  5.     <link name="home"></link>
  6.     <link name="video"></link>
  7.     <link name="audio"></link>
  8.   </links>
  9.   <images name="images" backgroundImage="images/largeBackground.gif" imgPath="images/">
  10.     <image>images/image_01.jpg</image>
  11.     <image>images/image_02.jpg</image>
  12.     <image>images/image_03.jpg</image>
  13.     <image>images/image_05.jpg</image>
  14.     <image>images/image_06.jpg</image>
  15.     <!--<image>images/image_04.jpg</image>-->
  16.   </images>
  17.   <messages>
  18.     <txt name="USleader">Hope your holidays go off with a BANG!</txt>
  19.     <txt name="USmessage"><![CDATA[Best wishes for a great new year from.]]></txt>
  20.     
  21.     <txt name="listID">139</txt>
  22.     <txt name="optOut">0</txt>
  23.     <txt name="emailSubject">You have been sent an **.com Holiday ECard!</txt>
  24.     <txt name="cardName">Holiday Card</txt>
  25.     <txt name="emailMessage"><![CDATA[Dear ==RECIPIENT_NAME==,
  26. ==SENDER_NAME== (==SENDER_EMAIL==) has sent you a ==CARD_NAME==.
  27. To view it, click the link below:
  28.       
  29. ==CARD_LINK==
  30.                       
  31. When you're done looking, check out ==WEBSITE_LINK== for news, videos, photos and tons of exclusives. 
  32. ==SENDER_NAME==                      
  33.                       
  34. http://==WEBSITE_LINK==]]></txt>
  35.     <txt name="pick_up_location"><![CDATA[http://www.officekuwa.com/soulsurvivores/holiday/index.php]]></txt>    
  36.   </messages>
  37. </xmasCard>

となっており、PHP側で
require '../holiday/data.xml';

と読み込んでいるだけです。tezcelloさんが仰るとおり「PHP での文字列の置き換え方がわからない」のですが、まずCDATA 部分を抽出するにはどうすればいいのでしょうか?
色々と自分で調べているのですが見つかりません。
申し訳ありませんが宜しくお願いします。

Re:Re:Re:XMLのデーターを変換

xml をいきなりソースとして取り込んじゃマズいような気が...
これでは、ただのタグとして出力してしまっていると思います。その PHP ファイルをブラウザで開いた時のソースを表示すると見る事ができると思います。ブラウザ上では意味不明のタグとして無視されているでしょうが。
それに、これが全文だとすると、xml宣言がないのでこのままでは xml 書類として認識してもらえないと思います。

僕なら、file_get_contents() で文字列として取り込むか、simplexml_load_file() で xml オブジェクトとして取り込むかのどちらかを選びます。(simplexml が使えない環境なら、他の手段となりますが simplexml 以外は使いたくないなぁと思っています。)
  一旦 file_get_contents() で文字列として取り込んだ後、
  simplexml_load_string() でxml オブジェクトにするのも可ですが。

簡単の為に文字列としての例を挙げます。
  1. // 文字列として読み込む
  2. $src = file_get_contents('../holiday/data.xml');
  3.  
  4. // パターンを指定して検索し、CDATA の内容を $res に書き出す
  5. if (!preg_match('/name="emailMessage "><!\[CDATA\[(.+?)]]>/s', $str, $res))
  6.   {// 検索失敗時の処理を書く}
  7.  
  8. // 成功時は、$res[1] に CDATA の内容が保存されている

Re:Re:Re:Re:XMLのデーターを変換

う~ん、難しいですね~。

Re:Re:Re:XMLのデーターを変換

xml でも試してみました。
  xml 宣言が無くってもOKでした。必須ではなかったですね。ごめんなさい  > all

  1. // ファイルを xml として取り込む
  2. // LIBXML_NOCDATA は CDATA を取り込むために必要のようです。(バージョンにより非対応)
  3. $x_data = simplexml_load_file('../holiday/data.xml', NULL, LIBXML_NOCDATA);
  4.  
  5. // name="emailMessage" となっている txt タグの内容を取り出す
  6. $res = $x_data->xpath('/xmasCard/messages/txt [@name="emailMessage"]');
  7.  
  8. // 取り出したい内容が必ずあるとする = エラー処理しない
  9. // 一つしかないとする = 複数あっても最初のものを有効とする
  10.  
  11. // 配列 $res の要素は XML オブジェクトだから、文字列にキャスト(=型変換)する
  12. $str = (string)$res[0];
これで、目的の CDATA が得られます。


> う~ん、難しいですね~。
前半の xml云々は忘れていただいても結構です。
分からない部分を教えていただければ、説明させていただきますけれど。


> 色々と自分で調べているのですが見つかりません。
「何をどう調べた」とか「○○まではできたが△△ができない」とかを提示されると、適切な情報が得られやすいです。
質問者さんの考え方に沿った回答であれば理解しやすいでしょうし、回答者側はたくさん調べ物をしなくてもOKかもしれません。
根本が間違っていれば、なぜそれが間違っていたかを知るチャンスも出てくるでしょう。

Re:Re:Re:Re:XMLのデーターを変換

tezcelloさん、色々とお手数かけてすいません。
simplexml_load_fileはPHP5ですよね。
自分のサーバーはPHP4なので使えません。
自分がやりたいのはdata.xmlの
  1. Dear ==RECIPIENT_NAME==,
  2. ==SENDER_NAME== (==SENDER_EMAIL==) has sent you a ==CARD_NAME==.
  3. To view it, click the link below:
  4.       
  5. ==CARD_LINK==
  6.                       
  7. When you're done looking, check out ==WEBSITE_LINK== for news, videos, photos and tons of exclusives. 
  8. ==SENDER_NAME==                      
  9.                       
  10. http://==WEBSITE_LINK==

部分が欲しく、尚且つ==RECIPIENT_NAME==等の箇所をFlash側から受け取った値に変更してメール送信したいのです。上のコードはメールの雛形として使用したいのです。
宜しくお願いします。やりたい部分に関して今は全く出来ていない状態です。Flashからの値はうまく受け取れてます。
宜しくお願いします。

Re:Re:Re:Re:Re:XMLのデーターを変換

> 自分のサーバーはPHP4なので使えません。
ごめんなさい。ご利用の環境が分からないので、自分の一番楽な方法でお答えしました。

XML を扱うのに pear を使うって手もありますが、XML としてではなく単なる文字列データと扱う事にします。
file_get_contents() が使えないほど若いバージョンではないですよね?)
  1. // ファイルデータの読込み
  2. $src = file_get_contents('../holiday/data.xml');
  3.  
  4. // CDATA部の抜き出し -> $res[1] に収められる
  5. $flag = preg_match('/name="emailMessage"><!\[CDATA\[(.+?)]]>/s', $src, $res);
  6.  
  7. // 置き換えるべき値の入っている配列を用意する
  8. $var = array(
  9.   'RECIPIENT_NAME'=>'宛先',
  10.   'SENDER_NAME'=>'送信者名',
  11.   'SENDER_EMAIL'=>'foo@hoge.com',
  12.   'CARD_NAME'=>'カード名',
  13.   'CARD_LINK'=>'http://www.hoge.com/card/',
  14.   'WEBSITE_LINK'=>'www.hoge.com/'
  15.   );
  16.  
  17. foreach ($var as $k=>$v){
  18.   $res[1] = preg_replace('/=='.$k.'==/', $v, $res[1]);
  19. }
先に提示したスクリプトは一部間違っていましたね。ごめんなさい。
回答している時に、分かりやすい名前に書き換えようとして中途半端にしてしまいました。
  foreach で置き換えるところの、置き換え後が別の変数になっていたので、
  最後の置き換えしか反映されていませんでした。


別に、わざわざ置き換えデータを配列にする必要は無いです。
preg_replace() を必要な置き換えの回数だけ並べて書けば同じ事なので。
 こんな感じでしょうか?
  $res[1] = preg_replace('/==RECIPIENT_NAME==/', $_POST['RECIPIENT_NAME'], $res[1]);
  $res[1] = preg_replace('/==SENDER_NAME==/', $_POST['SENDER_NAME'], $res[1]);
  ...


以下は、「こんな奴も居る」程度で読んでいただくだけで結構です。お返事も不要です。
> やりたい部分に関して今は全く出来ていない状態です。
いろいろとやった結果、望むような事ができていないのだとは思いますが、
「全く出来ていない」=「全くやっていない」と受け取られると困りますよね。
作ったスクリプトを示した上で、
「思ったような結果にならない」=>現状と理想を示す
「エラーが止まらない」=>エラーを示す
をすると回答する側は答え易いと思います。
携帯にhtmlメール 質問一覧 PHP+mysqlの日本語文字の取り扱いにつ...