ブログのRSSのデータから全角スペースを削除する - PHPプロ!Q&A掲示板

2596

  • 200P

ブログのRSSのデータから全角スペースを削除する

質問日時 / 2010年3月6日 13:42 (最終編集:3月6日 21:29)    回答数 / 10件

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

キーワード /     ASCII    スペース   

ブログ書いている人が何も考えないで全角のスペースでバランスをとるとということがありますが、それがデータ的に非常にジャマな場合があります。
http://www.phppro.jp/qa/2586 の質問の続きですが、

RSSをXMLライブラリーで配列に入れて出力することができました。

http://ikekumi.lovepop.jp/view/test4.php
ところがこのスペースを除きたいと思ってもうまくできません。

test4.php のコードは

  1. <?php
  2. require_once('xml.php'); //xmlライブラリーを取得
  3. $rdf_url = "http://ikekumi.lovepop.jp/bg/?mode=rss&c=6";
  4.  
  5. function getURL( $pURL ) {
  6.    $_data = null;
  7.    if( $_http = fopen( $pURL"r" ) ) {
  8.       while( !feof( $_http ) ) {
  9.          $_data .= fgets( $_http);
  10.       }
  11.       fclose( $_http );
  12.    }
  13.    return( $_data );
  14. }
  15.  
  16. $_rawData = getURL($rdf_url);
  17. $data = XML_unserialize($_rawData);
  18. $entry = $data["rdf:RDF"]["item"];
  19. $count = count($entry);
  20.  
  21. for($i=0$i<$count$i++){
  22. $title =$entry[$i]["title"];
  23. $link =$entry[$i]["link"];
  24. $description =$entry[$i]["description"];
  25. mb_convert_encoding($description,"utf-8");//これがなくても動くけどutf-8にしてみる
  26. $desc=trim($description,"")//普通にtrimでは絶対に前のスペースが取れず縲を指定したら初めて削除できる。ちなみにSJISで保存してないとこれも動かない。utf-8ではきかない。
  27. $desc=strtr($desc,"",''); //思いあまって縲を空白に置き換えろとか書いてみても動かず。
  28. $pattern ='!img\s+src\s*=\s*"http://ikekumi.lovepop.jp/bg/files/(\d+)\.jpg".+?/!i';
  29. $photo =$entry[$i]['content:encoded'];
  30. preg_match_all($pattern,$photo,$matches);
  31.  
  32. if(!$title){exit;}
  33.   else{
  34.   print($title."<br/>".$link."<br/>".$desc."<br/>");
  35.   $pcount=count($matches[1]);
  36.   for($s=0$s<$pcount$s++)
  37.   {
  38.   print($matches[1][$s]."<br/>");
  39.   }
  40.   print("<br />");
  41. }}
  42.  
  43. ?>

お陰で、だいたいできているのですが
http://ikekumi.lovepop.jp/index.html (クリックしないと始まらないのはしかたないですかねぇ)
ただ、どうもこのスペースが取れなくて苦労しております。

個人的にはこの部分はあきらめていますが、もしやと思ってお聞きします。

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



ツリー一覧

┗A01NurseAngelstr_replace($string,' ',''); trim($string,' '
 ┗A01-1yumisaikistr_replace($string,' ',''); だと全部消えてしま
  ┗A01-1-1shimix>$desc=trim($description,' '); ではまったく取れな
   ┗A01-1-1-1yumisaikimb_internal_Encoding() というのは初めて知りました
    ┗A01-1-1-1-1shimix>mb_convert_encording では変換できないのです。
     ┗A01-1-1-1-1-1yumisaikimb_detect_encordingではASCIIと表示されました。 ち
      ┗A01-1-1-1-1-1-1shimix蛇足ですが・・ スクリプトを『utf-8で保存』して
       ┗A01-1-1-1-1-1-1-1yumisaikiありがとうございます。思い通りにできました。 最
        ┗A01-1-1-1-1-1-1-1-1shimix>$desc = str_replace("  ","",$desc); >だけです
         ┗A01-1-1-1-1-1-1-1-1-1yumisaikiアホですね。 おっしゃるとおりで、 $desc = str_re

回答一覧

並び替え:

A01
answererNurseAngel [3月7日 04:07] (最終編集:3月7日 04:11)

str_replace($string,' ','');

trim($string,' ');でも行けると思うけど。

あとそのmb_convert_encoding()は意味がない。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryumisaiki [3月7日 12:36]

str_replace($string,' ',''); だと全部消えてしまうんです。
なんか間違えているんでしょうかねぇ。
$desc=trim($description,' '); ではまったく取れなくて、
$desc=trim($description,"縲");で しかも文字がJISだと取れてるのです。

不思議でたまりません。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyershimix [3月8日 10:09]

>$desc=trim($description,' '); ではまったく取れなくて、
>$desc=trim($description,"縲");で しかも文字がJISだと取れてるのです。

mb_internal_Encoding()が書かれていませんが、ひょっとしてスクリプトをsjisで書かれていませんか?SJISの"縲"は0xE380なので、utf-8の日本語空白(0xE38080)の2バイトめまでと一致します(0x80は置換されずに残りますが・・)。

#sjisのスクリプトであれば、mb_internal_Encoding('sjis')を必ず書いてください。

スクリプトをsjisで書いているのであればちゃんと取得したデータをSJISに変換してから扱うべきですし、逆にスクリプトを(取得するxmlに合わせて)utf-8で書いた方が楽じゃないかと思いますけど・・。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyeryumisaiki [3月8日 14:45]

mb_internal_Encoding() というのは初めて知りました。
ちょっとこれをヒントに調べてみます。
utf-8で常に書いているので、取得したデータをutf-8にしたいと思うのですが、うまく変換できません。
mb_convert_encording では変換できないのです。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1 満足
replyershimix [3月8日 14:57] (最終編集:3月8日 15:21)

>mb_convert_encording では変換できないのです。

to_encodingはutf-8として、from_encodingは何を指定するのでしょう?そもそもutf-8ではないんでしょうか?from_encodingを省略したmb_convert_encording()でおかしなことにならないかどうか、mb_detect_encoding()で確認してみてもいいかもしれませんが・・。

取得するデータがそもそもutf-8なのですから『スクリプトがutf-8であれば』mb_convert_encodingで変換する必要はありません。逆に変換するとしたら、form_encodingがutf-8でto_encodingが(スクリプトを記述している)sjisやeuc-jpになるべきです。


>utf-8で常に書いているので、

スクリプトの文字コードは間違いなくutf-8ですか?それで「縲」(utf-8なら0xE7B8B2)が機能するというのも考えにくいのですが・・。


(追記)
最初のソースで

>//普通にtrimでは絶対に前のスペースが取れず縲を指定したら初めて削除できる。
>ちなみにSJISで保存してないとこれも動かない。utf-8ではきかない。

と書いてありますから、ソースはSJISですよね・・・。mb_convert_encodingで、utf-8→sjisに変換してからtrimしてみれば何かわかるかもしれません。

#出力時に再変換しないとsjisのまま出力してしまいますが(汗

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyeryumisaiki [3月8日 15:00]

mb_detect_encordingではASCIIと表示されました。
ちょっと試行錯誤してまた報告します。結構ブログの全角スペースには悩まされていますので。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1 満足
replyershimix [3月8日 15:30]

蛇足ですが・・

スクリプトを『utf-8で保存』して

  1. $description = $entry[$i]["description"];
  2. $desc = trim($description," ");
  3. $desc = str_replace(" ","",$desc); // strtrはマルチバイト文字には無理なので、str_replaceで置換

とすれば「得たかったであろう」結果になるのですが・・。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1
replyeryumisaiki [3月9日 01:58]

ありがとうございます。思い通りにできました。

最初、utf-8でいつものように書いていて、$desc = trim($description," "); だけ書いて実行し、前の部分の空白がとれていなかったので、そこから先が考えつきませんでした。

それにしても、
$desc = str_replace(" ","",$desc); 
だけですと まったく表示されず、
両方書いて初めて思い通りになるというのは、どういうことなんでしょうか? 教えていただけるとありがたいです。
とりあえずポイントを差し上げたいので締切ます。

本当にありがとうございました。これはとても収穫でした。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1
replyershimix [3月9日 08:24]

>$desc = str_replace("  ","",$desc); 
>だけですと まったく表示されず、

$desc = trim($description," "); を省略(コメントアウト)したのであれば、$desc = str_replace("  ","",$description); に書き替えないといけないのですが、それを忘れていただけではないでしょうか($descに何もセットされていない状態でstr_replaceしている)。同じソースをコメントアウトしながら試しているとありがちです。元の$descriptionを使っていないのですから、最初から$desc = $entry[$i]["description"]; でもよかったような・・。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1
replyeryumisaiki [3月9日 08:52]

アホですね。
おっしゃるとおりで、
$desc = str_replace(" ","",$entry[$i]["description"]);

で一発OKで出ました!
お騒がせしました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

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