複数行の文字列を1行にまとめる方法について

このQ&Aのポイント
  • 複数行の文字列を1行にまとめる方法について
  • $strの複数行の文字列を1行にまとめる方法が分からず、アドバイスを求めています。
  • 行頭の空白文字を除去しながら、複数行の文字列を1行にまとめる方法を教えてください。
回答を見る
  • ベストアンサー

複数行の文字列を1行にまとめる方法について

下記の $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; ?> 以上、よろしくお願いします。

  • PHP
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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]); ?>

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご教示いただいたソースを試した所、意図した動作になったと思います。 このたびはどうもありがとうございました。 以上、よろしくお願いします。

その他の回答 (3)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

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

iroha_168
質問者

お礼

ご回答ありがとうございます。 出来れば修正箇所は最小範囲にとどめたいと思っています。 ご教示いただいた方法では、下記の二箇所の変更が必要になると思います。 1. No.1のお礼の動作の流れの2の削除 2. No.1のお礼の動作の流れの3の後に正規表現追加 No.1のお礼の動作の流れの1以前と3以降は特に問題なく動作しているようなので、 その部分には手をつけることなく、対応したいと思います。 以上、よろしくお願いします。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

んんんんん???何か また 俺が勘違いしてるんでしょうかねぇ。。 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); ?>

iroha_168
質問者

お礼

ご回答ありがとうございます。 今回最終的に欲しい値は下記となります。 あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへのまみむめもやいゆえよらりるれろわいうえおん.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)
回答No.1

んー、メールのヘッダーで よく見る感じの奴ですね。 こんなんじゃ、ダメって事なんですよね? mb_language('ja'); mb_internal_encoding('UTF-8'); print mb_decode_mimeheader($str);

iroha_168
質問者

お礼

ご回答ありがとうございます。 おっしゃるとおりご提示のソースでは意図した動作とはなりません。 動作の流れとしては下記となります。 1. ヘッダ取得($str) 2. 正規表現で文字列のname="以降~最後までを取得(1行の$strは動作しますが、複数行だと駄目でした) 3. mb_decode_mimeheaderでデコード(これはすでに動作していると思います) 上記の関係上、一番効率が良いのは$strが必ず1行になるようにすれば良いと思い今回の質問をさせていただきました。 以上、よろしくお願いします。

関連するQ&A

  • セル内文字を切取りその行範囲の列の空白セルに貼付

    B列3行目から添付のようにセル内にカンマを含む文字がありカンマで区切った文字ごとに切り取り矢印右のように同B列の次の空白行に順に貼り付けたく、その際カンマは削除したいです。また等間隔の名前の行がある中で枠内の空白に文字を張付けたく等間隔行数枠が多くてできればVBAコードがお分かりなる方宜しくお願いします。 環境はwindows7 office2013です。

  • エクセルVBA 文字列複数行・列連続連結

    エクセルVBA 文字列複数行・列連続連結でお教え下さい A列に基本文字(縦順) B列~F列に複数行データー(文字・時間) 文字結合時に改行 例 A2&B2&改行&A3&C2&改行&A4&D2&改行・・・・・ 次のデーター行 A&B3&改行&A3&C3&改行&A4&D3&改行・・・・・ データーの最終行まで連続で このような複数行あるデーターの連続文字列連結をしたいのですが・・・ 文字列連結後は 1.指定セルに貼り付け 2.クリップボードに貼り付け 3.テキストファイルに保存 よろしくお願い致します

  • エクセルVBA 行を文字列連結している列を連結した

    エクセルシートで行を文字列連結している列を連結したいのですが・・ 行を文字列連結しているセル「AY4」は、 データー入力されていない時は、「0」表示しないとか「””」もしくは指定文字列にしています。 =IF(AT4=0,"連結なし",ConcatenateRangeText(C4:AY4)) もしくは =IF(AT4=0,"",ConcatenateRangeText(C4:AY4)) この「AY4」のセルでデーター入力されたものだけ文字列連結したい 画面上は空白だったり「連結なし」と表示されるのでコピーすれば良いのしょうが、ユーザーフォームのCommandButton11_Click()で処理したいのですが。 又、データー入力のある、行の文字列連結と列の文字列を一緒で出来ても良いのですが

  • 文字列を複数の段落に分割して出力

    次のようなことを実現したいのですが、どのようなアルゴリズムになりますか? ------ 文字列が複数ある。各文字列は改行コード(\n)で区切られた複数行の文字列からなる。 string[STR_NUM]; // STR_NUM: 文字列数 これらの文字列をN段落に分けて出力したい。 ただし文字列の途中行で段落を変えない。 各段落の行数は最適値を求める。つまり、各段落に最も均等になるように振り分ける。 N=2でSTR_NUM=4の場合は次のような感じで出力する。 文字列1文字列1      文字列3文字列3文字列3 文字列1文字列1文字列1  文字列3文字列3 文字列1文字列1      文字列3文字列3文字列3 文字列1          文字列3 文字列2          文字列3文字列3文字列3 文字列2文字列2文字列2  文字列4文字列4               文字列4文字列4               文字列4文字列4文字列4               文字列4 全体で15行あるので、均等に割ると1段落は8行となり、詰めて出力すると文字列3の2行目で改段落されることになります。そうならないように文字列3は2段落目の頭から出力します。 求めたいのは、Nとstring[0]~string[MAX_STR-1]が与えられたときの「1段落あたりの最大行数」と「各段落に出力する文字列」です。 各段落に出力する文字列は結合した状態で、かつ最大行数に合わせるように末尾に改行コードを必要数追加するものとします。 1段落あたりの行数の制限はありません。与えられた文字列によって最適な行数を求めます。

  • 行単位の文字列処理

    JAVA初心者です。 以下のようなファイル形式があります。 ファイル名(TEXT.TXT) //////////////////////////////////// Aa BFUNC1,abc,def Ab BFUNC2,ghi BFUNC3 /////////////////////////////////// ファイル行単位の先頭(1文字目)に処理の判定識別子が付きます。 A:2文字目の文字を既存の設定してある文字と置き換える。 B:,で区切り最初が関数名次からが引数になります。(例FUNC1(abc,def)) 上記をJAVAで記述したい場合どのようにしたらいいでしょうか? FileReader in = new FileReader("TEST.TXT"); BufferedReader br = new BufferedReader(in); String line; while ((line = br.readLine()) != null) { /*行単位の先頭一文字をチェック*/ switch(){  ←行単位の先頭一文字を判定するには記述するには?  CASE: "A": /*文字列置換*/ br.replace(str ,br); break; CASE:"B": /*方法(1)","で分解して連結する。最初はNextTokenで文字列を連結 させ、次に"("をつけ、次からNextTokenで","をつけていく。","がな くなったら")"をつけるようにするには? */   /*方法(2)","の最初は関数名なのでNextTokenで(1)と同様に"("をつけ    る。次からは行末尾までを一度に連結させ、最後に")"をつけるように   するには?*/ break; } }   ?の個所を教えてください。 ほかに簡単な記述などあればそちらも教えてください。

  • セル内文字を切り取りその列の空白セルに貼付け

    B列3行目から添付のようにセル内にカンマを含む文字がありカンマで区切った文字ごとに切り取り矢印右のように同B列の次の空白行に順に貼り付けたく、その際カンマは削除したいのですが行数が多くてできればVBAコードがお分かりなる方宜しくお願いします。 環境はwindows7 office2013です。

  • 文字列抜き出し方法

    こんにちは、 test.batを DOSコマンド?(コマンドプロンプト) でコードを書いているのですが、 下記の文のときに、 "%~1"の2文字目から、最後の文字までを 抜き出したいのですがコマンドがわかりません。 (VBだとMID) どなたかわかりかた、いらっしゃいませんでしょうか。 if "%~1"=="" exit /b echo %1

  • 文字列を取り出す

    A列に[ No.××× ] あああああ・・・と入力されています。 毎回入力される行数が違います(100~300行) B列にNo.×××という文字列だけ取り出すために下記の関数が入っているのですが A列に入力のあった分だけをマクロで処理できませんか。 =LEFT(RIGHT(A2,LEN(A2)-FIND("[ No",A2,1)),8) 現在は300行目までこの関数が入った状態で、エクセルが重い気がします。

  • 文字列は大文字のまま、UTF-8エンコードの英字だけ小文字にしたい

    下記の方法でUTF-8エンコードをしたときに、 コードの英字が大文字になってしまい困っています。 use Encode; $str = "HOGEホゲ" $str =~ s/(\W)/'%' . unpack("H2", $1)/eg; print "$str"; 現状のエンコード後)HOGE%E3%83%9B%E3%82%B2 希望のエンコード後)HOGE%e3%83%9b%e3%82%b2 半角英数字(HOGE)は大文字のままで、 エンコードだけを小文字で書き出す簡単な方法はありますでしょうか。 (小文字でないと受け付けてくれないサイトに飛ばしたいため) 現状は正規表現でAからZまで26行繰り返しています。 $str =~s/\%([A-Z0-9]{1})?A/%$1a/g; ~ $str =~s/\%([A-Z0-9]{1})?Z/%$1z/g; よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現で特定文字列を含まない行を削除したいのですが

    テキストエディタ mi で正規表現のより「※補足」という文字列を含む行だけ残して他の行を削除しようとしています。 具体的には、 検索文字列 ^(?!.*\※補足).*$ 置換文字列            ← 空白 としてやっているんですが、例えば   なんとかかんとかで何やらが何として…   ※補足:よくわかりません   ※補足:質問します というテキストを上の方法で全置換すると何も起きません。 そこで試しに 検索文字列 ^(?!.*\※補足).*$ 置換文字列 ----- としてみました。 この場合、本当なら   -----   ※補足:よくわかりません   -----   ※補足:質問します となることを期待していたのですが、実際は   -----なんとかかんとかで何やらが何として…   ※補足:よくわかりません   -----   ※補足:質問します となってしまい、要するに「※補足」という文字列が含まれない行は正しく見つけてくれるものの、含まれていない行については、その行丸ごとを置き換えるのではなく行頭に置換文字列を付加するだけになってしまいます。 これは、何がどう悪いのでしょうか? ちなみに、こちらのサイトで「テキストで特定の文字列を含む行を削除」とQ&Aを検索すると、私の場合で言えば「^.*※補足.*\n」→「」(空白)という置換えで可能というご回答が見つかるのですが、miの場合、これでは「※補足」という文字列が含まている行も含まれていない行も見つけてくれませんでした。 どう直せば目的が達成されるか教えて頂けないでしょうか? どうかよろしくお願い致します。

    • ベストアンサー
    • Mac

専門家に質問してみよう