phpで”<>”で囲まれた文字列と改行と半角スペースを取り除くやり方を教えてください。


xxxx<yyyyyyy yyyyy>z
zz zz

xxxxzzzzz

に変換するやり方です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/11/30 01:32:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:nakamuraaaaa No.7

回答回数7ベストアンサー獲得回数2

ポイント40pt

readfile()は入力ファイルを標準出力してしまうので

$str1 = readfile("http://xx.com/xx.txt");

としても$str1には文字列が格納されません。

正確には関数内で標準出力に入力ファイルの内容を出力後、戻り値としてファイルから読み込んだバイト数を返します。

参考:http://www.php.net/manual/ja/function.readfile.php


もし読み込むファイルがスクリプトと同じサーバ内ならfopenで読み込めばよいです。

同一サーバでなくHTTPでアクセスしたい場合は以下のスクリプトで標準出力をバッファリングすることでPHPの変数に格納し、置換処理を実現できます。

※ob_start()からob_end_clean();までが重要。

<?php

ob_start();

readfile("http://xx.com/xx.txt");

$str = ob_get_contents();

ob_end_clean();

$str = preg_replace("/<.*>|\r\n|\s/", "", $str);

//必要であれば適切なエンコーディングを実行

//print mb_convert_encoding($str,'UTF-8','SJIS');

print $str;

?>

id:kanshizm

できました~~、ありがとうございました。

2006/11/30 01:30:32

その他の回答6件)

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

ポイント20pt

preg_replaceを使ってみてはどうでしょう。

<?php

$data = "xxxx<yyyyyyy yyyyy>z\nzz zz";

echo preg_replace("/(<.+>)|\n|\s/", NULL, $data);

?>

タグで囲まれた文字列に何かもっと制限がある場合は.+の部分を変える必要があります。

id:mugenkoubou No.2

回答回数10ベストアンサー獲得回数0

ポイント20pt

こんな感じでどうでしょうか?

$str = 'xxxx<yyyyyyy yyyyy>z
zz zz';

$replaced = preg_replace('/(<([^<>]+)>|[\s])/', '', $str);
id:kn1967 No.3

回答回数2915ベストアンサー獲得回数301

ポイント20pt

$a に元の文字列が入っていて

$b に置換後の文字列を入れるとすると、

$b = preg_replace("/<.*>|\s|\r|\n/", "", $a);


もしお望みの結果にならなかった場合は

$a に元の文字列が入っていて

$e に置換後の文字列を入れるとすると、

$b = preg_replace("/<.*>/", "", $a);

$c = preg_replace("/\s/", "", $b);

$d = preg_replace("/\r/", "", $c);

$e = preg_replace("/\n/", "", $d);

といった感じで分けてください。

id:yoski No.4

回答回数13ベストアンサー獲得回数0

ポイント20pt

preg_replace('/<[^>]*>|\s/', '', $str);

\s が改行にマッチするか不安なら

echo preg_replace('/<[^>]*>|[\s\r\n\f]/', '', $str);

ですかね。ってもうたくさん回答きてるし・・・

id:kanshizm

皆さん、ありがとうございます。

2バイト系文字が入っているからですかね?

うまくいきません。

正確にサンプルを書くと


あ ああ<xxxx>いいい

うう う<yyy>え え

あああいいいうううええ

でしょうか。よろしくお願いします。

2006/11/29 22:00:39
id:yoski No.5

回答回数13ベストアンサー獲得回数0

ポイント20pt

文字コードが UTF-8 なら preg_replace でうまく動くと思うんですが…

EUC なら mb_ereg を使うのがいいと思います。

※SJIS や JIS ってことはないですよね。。。

mb_eregi_replace('<[^>]*>|\s', '', $str);

id:kanshizm

文字コードはSJIJです。。。。

(^_^.)

↓では何も変化しません。

$utf=mb_convert_encoding($str,"UTF-8","SJIS");

$str2 = preg_replace("/<.*>/", "", $utf);

$sjis=mb_convert_encoding($str2,"SJIS","UTF-8");

print $sjis;

2006/11/29 23:09:40
id:nakamuraaaaa No.6

回答回数7ベストアンサー獲得回数2

ポイント20pt

うちのWindows環境・Linux(Fedora Core2)環境では以下のスクリプトでうまく「あああいいいうううええ」に変換できました。

<?php

$str = "あ ああ<xxxx>いいい

うう う<yyy>え え";


$str = preg_replace("/<.*>|\r\n|\s/", "", $str);

//以下のprint文はWindows環境なら不要

//うちのLinux環境(Fedora Core2ではこの1行を加えれば表示されることを確認しました。

print mb_convert_encoding($str,'UTF-8','SJIS');

?>

id:kanshizm

$str1 = readfile("http://xx.com/xx.txt");

$str2 = mb_convert_encoding($str1,"UTF-8","SJIS");

$str3 = preg_replace("/<.*>|\r\n|\s/", "", $str2);

$str4 = mb_convert_encoding($str3,"SJIS","UTF-8");

print $str4;

としましたがダメです。

xx.txtと出力するファイルがShift-JISです。(携帯HPです。)

サーバーはロリポップです。

/<.*>|\r\n|\s/の部分はいろいろ変えてますが、ピクリとも反応しません。

2006/11/29 23:21:29
id:nakamuraaaaa No.7

回答回数7ベストアンサー獲得回数2ここでベストアンサー

ポイント40pt

readfile()は入力ファイルを標準出力してしまうので

$str1 = readfile("http://xx.com/xx.txt");

としても$str1には文字列が格納されません。

正確には関数内で標準出力に入力ファイルの内容を出力後、戻り値としてファイルから読み込んだバイト数を返します。

参考:http://www.php.net/manual/ja/function.readfile.php


もし読み込むファイルがスクリプトと同じサーバ内ならfopenで読み込めばよいです。

同一サーバでなくHTTPでアクセスしたい場合は以下のスクリプトで標準出力をバッファリングすることでPHPの変数に格納し、置換処理を実現できます。

※ob_start()からob_end_clean();までが重要。

<?php

ob_start();

readfile("http://xx.com/xx.txt");

$str = ob_get_contents();

ob_end_clean();

$str = preg_replace("/<.*>|\r\n|\s/", "", $str);

//必要であれば適切なエンコーディングを実行

//print mb_convert_encoding($str,'UTF-8','SJIS');

print $str;

?>

id:kanshizm

できました~~、ありがとうございました。

2006/11/30 01:30:32

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません