htmlを読込んで情報を表示させる - PHPプロ!Q&A掲示板

610

  • 1000P

htmlを読込んで情報を表示させる

質問日時 / 2007年8月14日 03:14 (最終編集:8月14日 03:29)    回答数 / 7件

Questioner:  yumisaiki  このエントリーをはてなブックマークに追加 

キーワード / 外部ファイルの読込み    ブログ   

 http://www.phppro.jp/qa/detail.php?id=379 
でRSSの内容を表示させるというのを作らせていただき、その後、便利に使っております。

 ただ、今新しく作った http://www.oppai-bra.com/bg/index.php 
 ぶろぐんプラス http://www.blogn.org/ というもので作ったページですが、 
 RSSが 初期設定のページだけでしか表示されません。
 http://www.oppai-bra.com/bg/?mode=rss

初期設定のページの情報が3つしかないので、各カテゴリーごとの最新の情報を表示させるPHPを作りたい場合、RSSを利用しても正しく表示されないことになります。


 ですから、カテゴリー別に表示させるのに、別にRSSじゃなくても htmlの状態ならどうかな? と思って、例えば ハーブ教室のカテゴリーのページ http://www.oppai-bra.com/bg/index.php?c=5- を単純にRDFのところに入れ替えてみましたが、何も表示されません。

 http://www.oppai-bra.com/blog2.php

  1. <?php 
  2. // HTMLの指定 
  3. $rdf_url = "http://www.oppai-bra.com/bg/index.php?c=5-"
  4.   
  5. // RSSを取得 
  6. $content = file_get_contents($rdf_url)
  7.   
  8.  
  9.   
  10. // rdfを解析する (下の関数で処理) 
  11. $datas = analyze_rdf($content)
  12. mb_convert_variables("SJIS","UTF-8",$datas);  
  13.   
  14.  
  15. // rdf ファイルを解析するための関数 
  16. function analyze_rdf($cnt) { 
  17.     // <item> ~ </item> を切り出す 
  18.     $ptn = '/<item[^>]*>(.+)<\/item>/sU'
  19.     preg_match_all($ptn$cnt$matches)
  20.   
  21.     // マッチしてれば 
  22.     if (count($matches) > 0) { 
  23.         // 配列に入れる 
  24.         $items = $matches[1]
  25.     } else { 
  26.         return FALSE
  27.     } 
  28.     
  29.     
  30.    
  31.     // パターンの指定  
  32.     $ptns["link"] =  '/<link>(.*)<\/link>/sU';  
  33.     $ptns["title"] = '/<title>(.*)<\/title>/sU'
  34.     $return_array = array()
  35.   
  36.     // link の抜き出し 
  37.     foreach ($items as $val) { 
  38.         $res = array()
  39.   
  40.         preg_match($ptns["link"]$val$matches)
  41.         $res["link"] = $matches[1]
  42.         preg_match($ptns["title"]$val$matches)
  43.         $res["title"] = $matches[1]
  44.   
  45.         $return_array[] = $res
  46.      
  47.     } 
  48.   
  49.     // 配列を返す 
  50.     return $return_array
  51. } 
  52.  
  53.   
  54.  
  55.   
  56.     // $count 個分の配列を生成 
  57.     for ($i = 0$i < $count$i++) { 
  58.         $tmp_array[] = $i
  59.     } 
  60.   
  61.  
  62.   
  63. // HTML に整形するための関数 
  64.  
  65. function make_html($data) { 
  66.     $str = "<a target=\"_parent\" href=\"" . $data["link"] . "\">"
  67.     $str .= $data["title"]."</a>";
  68.     return $str
  69. } 
  70.  
  71. print make_html($datas[0]);
  72.  
  73. ?>

何かよいアドバイスないでしょうか?
RSSを指定した http://www.oppai-bra.com/blog.php は表示されます。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01signalちょっと見てみましたが、ぶろぐん+ですね。 inde
┃┗A01-1yumisaikiありがとうございます。 これで何とかなりそうです。
┃ ┗A01-1-1signal「全カテゴリのHTMLを読み込んでそれぞれの最初の1件
┃  ┗A01-1-1-1yumisaikisignal 様 いつもありがとうございます。  本日
┗A02signalぶろぐんに機能追加が面倒だったので、単体スクリプト
 ┗A02-1yumisaikiすみません。 ありがとうございます。 SIGNALさんに
  ┗A02-1-1signalそちらの環境で動いたならよかったです。 お礼なん

回答一覧

並び替え:

A01 満足
answerersignal [8月14日 14:54] (最終編集:8月14日 14:56)

ちょっと見てみましたが、ぶろぐん+ですね。

index.php の 1398行目を
  1. $filelist = blogn_mod_db_log_load_for_viewer($user, 0, BLOGN_LOG_VIEW_COUNT);

こうしたらどうでしょうか?
  1. $cid = @$_GET['c'];
  2. $filelist = $cid ? blogn_mod_db_log_load_for_category($user, 0, BLOGN_LOG_VIEW_COUNT, $cid, BLOGN_CATEGORY_VIEW_MODE)
  3.                  : blogn_mod_db_log_load_for_viewer($user, 0, BLOGN_LOG_VIEW_COUNT);

とりあえず試してみましたが、問題なく動作しているようです。
プログラム的な美しさを求めないのなら、こんな感じでよいかと思います。

--- 追記

http://www.oppai-bra.com/bg/?mode=rss&c=1-1
http://www.oppai-bra.com/bg/?mode=rss&c=5

のようにカテゴリIDをくっつけてアクセスすれば、指定したカテゴリのRSSが取得できます。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryumisaiki [8月14日 17:52] (最終編集:8月14日 17:58)

ありがとうございます。
これで何とかなりそうです。

と、いいながら、1398行目 加工したことで カテゴリー別のRSSが表示されるということですね。



でもHTMLの読み込みはできないんですかね?

(でも考えたらtitle がページのタイトルとかあって単純ではないと後から気がついた)



それにしても…
ブログンはダメですね。 1万円もしたんですけど。 軽いし動作はいいんですが。

  アドミンの画面で編集できる htmlには

 <!-- ▽最新記事一覧▽ -->
          {NE}
          <div class="linktitle">NEW ENTRIES</div>
          <div class="linktext">
            <ul>
            {NELOOP}
              <li class="li_main">{NELINK}{NETITLE}{/NELINK} ({NEYMD}m/d{/NEYMD})</li>
            {/NELOOP}
            </ul>
          </div>
          {/NE}

とかあるので、ここを利用できないだろうかと、模索してみたのですが、
私には無理って気持ちでした。


これだったら nucleus の方が加工とかしやすいような気がします。

どちらにしても、ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyersignal [8月14日 20:15]

「全カテゴリのHTMLを読み込んでそれぞれの最初の1件を取得する」
というのはかなりヘビーな処理になりますので、"可能であれば"提供されている
機能の組み合わせで解決したいところです。

NEW ENTRIES の部分を参考にして、カテゴリ別の最新投稿は表示できそうですね。

データベース(MySQL、PostgreSQL、Text)は何を使用されていますか?
MySQLかTextであればこちらで確認できますので、やってみたいと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyeryumisaiki [8月15日 01:49] (最終編集:8月15日 01:52)

signal 様 いつもありがとうございます。 

本日 version 2.5.0 にアップデートしました。
利用タイプ は mysql版

です。

バージョンアップして・ジャンル別表示処理の表示不具合を修正 とあるのでやってみたが、何が悪かったんだろうという感じです。

わざわざ自己環境でトライしていただけるのですか? 
ほとんど仕事の依頼みたいになってるんですけど、どうやってお礼をしたらいいでしょうか?
ここメールシステムがないので不便ですね。 

いつも本当に勉強になっています。

この意見に回答する

ツリーへ TOPへ

A02 満足
answerersignal [8月15日 23:59] (最終編集:8月16日 00:19)

ぶろぐんに機能追加が面倒だったので、単体スクリプトです。

89行目辺りから表示関係ですので、適当に変更してみてください。

--- 追記
カテゴリIDをカンマで区切って指定すると指定されたカテゴリの最新投稿を表示

http://*****/スクリプト名.php?c=1-1,2,3,4

何も指定しないと全カテゴリの最新投稿を表示

http://*****/スクリプト名.php
---

  1. <?php
  2. # -------------------------------------
  3. # 接続の設定
  4. $S = array(
  5.   'HOST' => ''# データベースのアドレス (ex: localhost
  6.   'USER' => ''# 接続ユーザ名
  7.   'PASS' => ''# 接続パスワード
  8.   'NAME' => ''# データベース名
  9. );
  10.  
  11. # -------------------------------------
  12. # カテゴリ一覧の取得
  13. function get_category() {
  14.   $categories = array();
  15.  
  16.   $result = mysql_query( 'SELECT id, category_name AS name FROM blogn_categorygroup' );
  17.   while ( $row = mysql_fetch_array( $resultMYSQL_ASSOC ) ) {
  18.     $categories[ $row['id'] . '|' ] = $row['name'];
  19.   }
  20.  
  21.   $result = mysql_query( 'SELECT id, category_name AS name, group_id FROM blogn_categorylist' );
  22.   while ( $row = mysql_fetch_array( $resultMYSQL_ASSOC ) ) {
  23.     $categories[ $row['group_id'] . '|' . $row['id'] ] = $categories[ $row['group_id'] . '|' ] . '::' . $row['name'];
  24.   }
  25.  
  26.   return $categories;
  27. }
  28.  
  29. # -------------------------------------
  30. # 表示を行うカテゴリIDの取得
  31. function request_category() {
  32.   $request = $_REQUEST['c'];
  33.   $request = preg_replace( '/[^\d,-]/'''$request );
  34.   $request = preg_replace( '/[-]+/''|'$request );
  35.  
  36.   $cid = array();
  37.   foreach ( explode( ','$request ) as $id ) {
  38.     if ( $id == '' ) continue;
  39.     if ( strstr( $id'|' ) === false ) $id .= '|';
  40.     $cid[] = sprintf( "'%s'"$id );
  41.   }
  42.  
  43.   return $cid;
  44. }
  45.  
  46.  
  47. # -------------------------------------
  48. {
  49.   $db = mysql_connect( $S['HOST']$S['USER']$S['PASS'] );
  50.   mysql_select_db( $S['NAME'] );
  51.  
  52.   # エントリの取得
  53.   $cid = request_category();
  54.   $sql = <<<SQL
  55. SELECT A.id
  56.      , A.date
  57.      , A.category_id
  58.      , B.title
  59.   FROM blogn_loglist A
  60.   JOIN blogn_logdata B ON A.id = B.id
  61. SQL;
  62.   if ( count( $cid ) ) $sql .= sprintf( 'WHERE category_id IN ( %s )'implode( ''$cid ) );
  63.   $sql .= ' ORDER BY date DESC';
  64.   $result = mysql_query( $sql );
  65.  
  66.   # カテゴリ一覧
  67.   $categories = get_category();
  68.  
  69.   $entries = array();
  70.   $exists  = array();
  71.  
  72.   # エントリ分処理を行う
  73.   while ( $row = mysql_fetch_array( $resultMYSQL_ASSOC ) ) {
  74.  
  75.     # 既に取得済みのカテゴリならパス
  76.     if ( isset( $exists[$row['category_id']] ) ) continue;
  77.     $exists[$row['category_id']] = true;
  78.  
  79.     # 投稿日のフォーマット
  80.     $row['format_date'] = preg_replace( '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/'"$1/$2/$3 $4:$5:$6"$row['date'] );
  81.  
  82.     # カテゴリ名の取得
  83.     $row['category_name'] = $categories[$row['category_id']];
  84.  
  85.     $entries[] = $row;
  86.   }
  87.  
  88.  
  89.   # 表示
  90.   $buffer = '<ul>';
  91.   foreach ( $entries as $entry ) {
  92.     $buffer .= sprintf( '<li><a href="/?eid=%d">%s</a><br />[%s] at %s</li>'$entry['id']$entry['title']$entry['category_name']$entry['format_date'] );
  93.   }
  94.   $buffer .= '</ul>';
  95.  
  96.   header( 'Content-Type: text/html; charset=UTF-8' );
  97.   print $buffer;
  98.  
  99. }
  100. # -------------------------------------
  101. ?>

この意見に回答する

ツリーへ TOPへ

A02-1
replyeryumisaiki [8月17日 16:00]

すみません。 ありがとうございます。
SIGNALさんにお礼がしたくて、新しい投稿作ったのですが、そちらにこれを書き込んでいただけないでしょうか?

私がしたかったことが書いてあるので。

この意見に回答する

ツリーへ TOPへ

A02-1-1 満足
replyersignal [8月17日 21:48]

そちらの環境で動いたならよかったです。

お礼なんていりません。趣味ですから。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)