質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

10957閲覧

【PHP】trimやstr_replaceでも消えない空白

dokoniarukana

総合スコア31

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/11/29 04:22

表題の通りです。

Webサイトからスクレイピングをして情報を配列に出力しています。
しかしある項目からどうしても左右の空白が削除できなくて困っています。
こちらを参考にして

$description = str_replace( "\xc2\xa0", " ", $description ); $description = trim( preg_replace( '/[\n\r\t ]+/', ' ', $description), ' ' );

を試しましたが
どうしても下のようにすごいスペースが残ります。

[0]=> string(38) " ここに文字列 " [1]=> string(38) " ここに文字列 " [2]=> string(38) " ここに文字列 " [3]=> string(38) " ここに文字列 " [4]=> string(38) " ここに文字列 " [5]=> string(22) " ここに文字列 " [6]=> string(22) " ここに文字列 "

###コード
使用しているのはこんな感じです。
空白が無いところはきちんと文字だけを持ってきているので
コード自体には問題ないと思うのですが・・・

削除できない時点でこれが普通のスペースじゃないことはわかりました。
これの正体を知りたいところですが、参考したサイトを見てもいまいち理解出来なかったので
申し訳ありませんがご鞭撻の程をよろしくお願いいたします。

$list = []; if ($main->filter('div')) { $main->Filter('div')->Filter('ul li')->each(function($node)use(&$list) { $list[] = $node->Filter('a')->text(); }); }; var_dump($list);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/11/29 04:33

$description = str_replace( " ", " ", $description ); は、試してみましたか?
dokoniarukana

2016/11/29 04:34

はい、試してみましたが消えず・・・です。
popobot

2016/11/29 04:45

urlencode()で空白のバイナリコードを調べたらどうでしょうか
guest

回答3

0

解決済みになったようですが、アプローチとして残しておきます。

まず消そうとしている空白が何なのかを知る必要があると思います。
Unicode(UTF8など)としてお話ししますが、

PHP

1echo $description;

で、「+%E3%80%80%09%0A%0D」とかの出力が得られますので、この%を0xに置き換えてみるとUnicodeのコードがわかります。

この「+%E3%80%80%09%0A%0D」を例に話すと、
まず最初の「+」は、URLエンコードの表記ですので半角スペース(Asciiコード HEX20)です。

次が「E3」ですので、これをUnicodeのコード表で見てみると
まず「Ex 3バイト文字の開始バイト」とページ上部にあります。
ので、つまり「E3 80 80」の3バイトで1文字を表している事がわかります。
今回の要件としては、空白で表示される文字のバイトコードを知る事ですのでここまででいいっちゃいいんですが。
一応確認の為、E3 80 80が何の文字かを同じページで調べると、全角スペースっぽい事がわかります。
同様に、次の文字の「09」は「HT」これは「Horizontal Tab」の略で、いわゆるTAB文字です。
次の「0A」は「LF」=「Line Feed」で、改行コードの「CR-LF」の「LF」です。
最後の「0D」は「CR」=「Carriage Return」で、これも改行コードの「CR」とわかります。

で、このようにしてどのコードの文字が入っているのかを調べて、それをstr_replaceすればOKです。

PHP

1$string = " \t\n\r"; 2 3echo urlencode($string).PHP_EOL; 4echo urlencode($string = str_replace("\x20", "", $string )).PHP_EOL; 5echo urlencode($string = str_replace("\xe3\x80\x80", "", $string )).PHP_EOL; 6echo urlencode($string = str_replace("\x09", "", $string )).PHP_EOL; 7echo urlencode($string = str_replace("\x0A", "", $string )).PHP_EOL; 8echo urlencode($string = str_replace("\x0D", "", $string )).PHP_EOL;

実行結果

[user@ ~]$ php -f te.php +%E3%80%80%09%0A%0D %E3%80%80%09%0A%0D %09%0A%0D %0A%0D %0D

投稿2016/11/29 05:33

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dokoniarukana

2016/11/29 05:41

懇切丁寧にわかりやすいご説明ありがとうございます。 そういう方法で調べるんですね。 今後に生かせそうなのでよく覚えておきます!
guest

0

もしかして $discriptionって arrayですか?
trim()は arrayに対しては無効です。ループしてひとつずつtrim()してください。

php

1$description = str_replace( "\xc2\xa0", " ", $description ); 2$description = preg_replace( '/[\n\r\t ]+/', ' ', $description); 3foreach ($description as $idx => $item) { 4 $description[$idx] = trim($item); 5}

投稿2016/11/29 04:55

編集2016/11/29 04:57
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dokoniarukana

2016/11/29 05:39

回答ありがとうございました。 arrayに対して無効というのは知りませんでした。。。
guest

0

ベストアンサー

これ空白を空白にしてませんか

$description = trim( preg_replace( '/[\n\r\t ]+/', ' ', $description), ' ' ); $description = trim( preg_replace( '/[\n\r\t ]+/', '', $description), ' ' );

投稿2016/11/29 04:43

date

総合スコア1820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dokoniarukana

2016/11/29 04:48 編集

どのコードを記述しても <b>Warning</b>: trim() expects parameter 1 to be string, array given in とエラーが出てしまいます。 一番手っ取り早いと思われる $array = array(trim($list)); var_dump($array);も同様にだめでした。
date

2016/11/29 04:54

$array = array_map('trim', $list); var_dump($array); でどうですか
dokoniarukana

2016/11/29 04:56

なんてことでしょう! その記述で空白が完全に消えました…! 今まで悩み狂っていたのが嘘のようです。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問