アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記の $str の文言を1行にまとめたいと思ったのですが、どうすればできるか分からないことがあったので、アドバイスいただける方がいらっしゃいましたら、ご教示の程、よろしくお願いします。

なお、下記の条件を想定しています。
1. 行数は1行の事もあれば、複数行になる事もあります。
2. 行頭に空白文字が有る場合に連結したいと思います(下記のサンプルでは$strの2~4行目の行頭に空白文字があります)。

<?php
$str = 'text/plain; name="=?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNRsoQg==?=
=?iso-2022-jp?B?GyRCJDckOSQ7JD0kPyRBJEQkRiRIJEokSyRMJE0kTiRPJFIkVSRYJE4bKEI=?=
=?iso-2022-jp?B?GyRCJF4kXyRgJGEkYiRkJCQkZiQoJGgkaSRqJGskbCRtJG8kJCQmJCgbKEI=?=
=?iso-2022-jp?B?GyRCJCokcxsoQi50eHQ=?="';

// 上記を1行にして出力したいと思います。
// その際、行頭の空白文字は除去したいと思います。
echo $str;
?>

以上、よろしくお願いします。

A 回答 (4件)

んー、メールのヘッダーで よく見る感じの奴ですね。



こんなんじゃ、ダメって事なんですよね?

mb_language('ja');
mb_internal_encoding('UTF-8');
print mb_decode_mimeheader($str);
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

おっしゃるとおりご提示のソースでは意図した動作とはなりません。

動作の流れとしては下記となります。
1. ヘッダ取得($str)
2. 正規表現で文字列のname="以降~最後までを取得(1行の$strは動作しますが、複数行だと駄目でした)
3. mb_decode_mimeheaderでデコード(これはすでに動作していると思います)

上記の関係上、一番効率が良いのは$strが必ず1行になるようにすれば良いと思い今回の質問をさせていただきました。

以上、よろしくお願いします。

お礼日時:2011/01/26 08:53

んんんんん???何か また 俺が勘違いしてるんでしょうかねぇ。


mb_decode_mimeheader()って $strが 複数行でも ちゃんと解析して答えを出してくれてるみたいですよ?
PHPのバージョンとかに依存するんですかね~

下記のソースで 表示されるもの↓
text/plain; name="あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.txt"

<?php
$str = 'text/plain; name="=?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNRsoQg==?=
=?iso-2022-jp?B?GyRCJDckOSQ7JD0kPyRBJEQkRiRIJEokSyRMJE0kTiRPJFIkVSRYJE4bKEI=?=
=?iso-2022-jp?B?GyRCJF4kXyRgJGEkYiRkJCQkZiQoJGgkaSRqJGskbCRtJG8kJCQmJCgbKEI=?=
=?iso-2022-jp?B?GyRCJCokcxsoQi50eHQ=?="';

mb_language('ja');
mb_internal_encoding('UTF-8');
print mb_decode_mimeheader($str);
?>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

今回最終的に欲しい値は下記となります。

あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.txt

その為、先頭の「text/plain; name="」や末尾の「"」は不要となります。
これについてはNo.1のお礼の動作の流れの2で実現できていると思います。
ただし、2の正規表現は下記となるのですが、$strが1行の場合は動作しますが、複数行だと途中でファイル名が切れてしまいました。
その為、$strが複数行の場合でも1行に変換する事が出来れば解決すると思い、今回ご質問させていただきました。

// 2の正規表現
preg_match('/name\s*=\s*"?([^"\s\r\n]+)"?\r?\n?/is', $str, $p_match)

// エンコードされた MIME ヘッダの文字列 str のファイル名部分(これがmb_decode_mimeheaderを実行する前に欲しい値となります)
$p_match[1]

以上、よろしくお願いします。

お礼日時:2011/01/26 14:44

え~っと。

。。最終的に欲しいのが「あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.txt」なんですよね?

「text/plain; name="あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.txt"」までは出来ているので、これから正規表現で 「text/plain; name="~"」の間を抜き出せばいいんじゃないん?って思うのですが。。。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

出来れば修正箇所は最小範囲にとどめたいと思っています。
ご教示いただいた方法では、下記の二箇所の変更が必要になると思います。

1. No.1のお礼の動作の流れの2の削除
2. No.1のお礼の動作の流れの3の後に正規表現追加

No.1のお礼の動作の流れの1以前と3以降は特に問題なく動作しているようなので、
その部分には手をつけることなく、対応したいと思います。

以上、よろしくお願いします。

お礼日時:2011/01/27 14:58

端的に、複数行にまたがる「name="・・・"」の中身をとりたいなら


s修飾子をつけてpreg_matchすればいいでしょう

<?PHP
mb_internal_encoding("EUCJP");

$str = <<<eof
test
test
text/plain; name="=?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNRsoQg==?=
=?iso-2022-jp?B?GyRCJDckOSQ7JD0kPyRBJEQkRiRIJEokSyRMJE0kTiRPJFIkVSRYJE4bKEI=?=
=?iso-2022-jp?B?GyRCJF4kXyRgJGEkYiRkJCQkZiQoJGgkaSRqJGskbCRtJG8kJCQmJCgbKEI=?=
=?iso-2022-jp?B?GyRCJCokcxsoQi50eHQ=?="
test
test
eof;

$pattern="/name=\"(.*?)\"/mis";
preg_match($pattern,$str,$match);
print $match[1]."<br>";
print mb_decode_mimeheader($match[1]);

?>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご教示いただいたソースを試した所、意図した動作になったと思います。

このたびはどうもありがとうございました。
以上、よろしくお願いします。

お礼日時:2011/01/27 15:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!