- ベストアンサー
複数行の文字列を1行にまとめる方法について
- 複数行の文字列を1行にまとめる方法について
- $strの複数行の文字列を1行にまとめる方法が分からず、アドバイスを求めています。
- 行頭の空白文字を除去しながら、複数行の文字列を1行にまとめる方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
端的に、複数行にまたがる「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]); ?>
その他の回答 (3)
- bm_hiro
- ベストアンサー率51% (200/388)
え~っと。。。最終的に欲しいのが「あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.txt」なんですよね? 「text/plain; name="あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.txt"」までは出来ているので、これから正規表現で 「text/plain; name="~"」の間を抜き出せばいいんじゃないん?って思うのですが。。。
お礼
ご回答ありがとうございます。 出来れば修正箇所は最小範囲にとどめたいと思っています。 ご教示いただいた方法では、下記の二箇所の変更が必要になると思います。 1. No.1のお礼の動作の流れの2の削除 2. No.1のお礼の動作の流れの3の後に正規表現追加 No.1のお礼の動作の流れの1以前と3以降は特に問題なく動作しているようなので、 その部分には手をつけることなく、対応したいと思います。 以上、よろしくお願いします。
- bm_hiro
- ベストアンサー率51% (200/388)
んんんんん???何か また 俺が勘違いしてるんでしょうかねぇ。。 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); ?>
お礼
ご回答ありがとうございます。 今回最終的に欲しい値は下記となります。 あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.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] 以上、よろしくお願いします。
- bm_hiro
- ベストアンサー率51% (200/388)
んー、メールのヘッダーで よく見る感じの奴ですね。 こんなんじゃ、ダメって事なんですよね? mb_language('ja'); mb_internal_encoding('UTF-8'); print mb_decode_mimeheader($str);
お礼
ご回答ありがとうございます。 おっしゃるとおりご提示のソースでは意図した動作とはなりません。 動作の流れとしては下記となります。 1. ヘッダ取得($str) 2. 正規表現で文字列のname="以降~最後までを取得(1行の$strは動作しますが、複数行だと駄目でした) 3. mb_decode_mimeheaderでデコード(これはすでに動作していると思います) 上記の関係上、一番効率が良いのは$strが必ず1行になるようにすれば良いと思い今回の質問をさせていただきました。 以上、よろしくお願いします。
お礼
ご回答ありがとうございます。 ご教示いただいたソースを試した所、意図した動作になったと思います。 このたびはどうもありがとうございました。 以上、よろしくお願いします。