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

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

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

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

PHP

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

Q&A

解決済

2回答

1624閲覧

PHPでの文字列置換(複雑)

falcon0321

総合スコア16

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

PHP

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

0グッド

0クリップ

投稿2016/03/08 10:27

PHPで独自タグを作成しているのですが、質問させてください。
良くある某掲示板のようなhtmlを出力させたいのですが、

【やりたいこと】

##1##
あいうえお

##2##
かきくけこ

##1##
さしすせそ

##3##
たちつてと

というテキストを


  1. Aさん 2016年1月1日01時01分

あいうえお

  1. Bさん 2016年1月1日01時04分

かきくけこ

  1. Aさん 2016年1月1日01時07分

さしすせそ

  1. Cさん 2016年1月1日01時10分

たちつてと

という風に置換したいです。

つまり

##1##
##2##
##3##

という3つの独自タグがあり、その出現順に連番を振り、

1ならAさん
2ならBさん
3ならCさん

という名前を入れ、また、日時の部分も上から順に3分単位で足していく。

という事をしたいです。

どんな方法で実現できますでしょうか?ご教授頂ければ幸いです。

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

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

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

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

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

unau

2016/03/08 10:31

変換前、変換後、それぞれの期待している文字列をプレーンに(html 解釈させずに) 示してもらったほうがよいかと思います。
guest

回答2

0

これは、terushuさんの書かれたちゃんとしたものとは違う
適当にやっつけるときのコードです。

php

1// テキスト 2$text = <<< EOT 31## 4あいうえお 52行目 62## 7かきくけこ 81## 9さしすせそ 103## 11たちつてと 12EOT; 13 14// ユーザー 15$users = ['A', 'B', 'C']; 16 17 18// 以下処理 19$lines = preg_split('/(\d##)/', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 20 21for($i = 0; $i < count($lines); $i+=2) { 22 $items[] = [$lines[$i], trim($lines[$i + 1])]; 23} 24 25$fmt = '%d. %sさん %s<br>%s<br><br>'; 26$date = DateTime::createFromFormat('Y-m-d H:i:s', '2016-01-01 01:01:00'); 27$i = 0; 28 29foreach($items as $item) { 30 echo sprintf($fmt, $i + 1, $users[str_replace('##', '', $item[0]) - 1], date_format($date, 'Y年n月j日H時i分'), str_replace("\n", '<br>', $item[1])); 31 date_add($date, date_interval_create_from_date_string('3 minutes')); 32 $i++; 33}

投稿2016/03/08 20:07

編集2016/03/08 20:42
kagi_shippo

総合スコア105

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

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

0

ベストアンサー

既存のテキストファイルに入っているデータを整形して別のものに出力したいという理解でよろしいでしょうか。

まずは、自分で元テキストファイルの構成をphpのコードで解析させて、その後好きな形式で出力する方法です。

php

1$content = file_get_contents($filename); 2$lines = explode("\n", $content); //各行を配列に変換する 3$now = time(); 4$data = array(); //解析結果を入れる配列 5$i = 0; 6$user = null; 7while($i < count($lines)){ 8 if(strpos($lines[$i], '##')!==false){ //##がある行はユーザー情報 9 $values = explode('##', $lines[$i]); 10 if(count($values)>0){ 11 $user = $values[0]; //誰かを格納 12 }else{ 13 continue; //期待した構造でなかったらスキップするなども入れると良いです 14 } 15 }else{ 16 if($user!=null){ 17 $data[]=array( //最後に確認されたユーザーの書き込みと判断 18 'user'=>$user, 19 'time'=>$time, 20 'body'=>$lines[$i], 21 ); 22 $time += 3*60; //時間を3分進ませる 23 } 24 } 25 $i++; 26} 27var_dump($data); //このデータを好きに出力する 28$users = array( 29 1=>'A', 30 2=>'B', 31 ・・・ 32); 33foreach($data as $index=>$item){ 34 //適当な形式で出力する。isset($users[$user]))等の処理も本来は必要 35 echo "<p>{$index+1} {$users[$item['user']]}さん {date('m月d日 H時i分', $users[$item['time']])}<br>{$item['body']}<\p>"; 36}

手打ちですのでエラーはでるかと思いますが、形としてはこのようになります。
最後のecho文は、{}内関数は概念を表すもので、実際はいったん変数に代入するなどした方が良いと思います。

元ファイルが大きいときは、いっぺんにfile_get_contentsで開くのでは無く、fopenを使って1行ずつ読み込むなども必要になると思います。

他には、preg_matchといった正規表現で抽出する方法もありますし、この方が速い場合もあります。
まずは基本的なメソッドを提示させていただきました。

投稿2016/03/08 11:21

編集2016/03/08 11:22
terushu

総合スコア358

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問