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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

593閲覧

自作掲示板に正規表現の削除機能を実装したい

naberius

総合スコア11

PHP

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/07/10 05:43

編集2018/07/10 06:04

自作掲示板に投稿番号とパスワードを入力して投稿を削除できる機能を実装しようとしたのですがファイル内から投稿番号とパスワードを検索するところが上手くいきません。
ゴールはファイルの中からPOSTされた投稿番号とパスワードに一致する行を探して空白を挿入して削除することです。
現象としてはエラー文は出ず投稿番号欄とパスワード欄の文字が消えて他は何も変わらないといった状態です。
正規表現を使っているんですがどなたか助言をお願いします。
機能のところだけ載せようかと思ったのですが全体があった方がいいかと思い載せました。見づらくてすみません。

PHP

1<?php 2ini_set('display_errors', 1); 3//アクセスカウンターの部分 4$filename = 'counter.dat'; 5 6$fp1 = fopen($filename, "r+"); 7flock($fp1,LOCK_EX); 8$count = fgets($fp1,32); 9$count++; 10fseek($fp1, 0); 11fputs($fp1, $count); 12flock($fp1, LOCK_UN); 13fclose($fp1); 14//ここまでアクセスカウンター 15 16//定義系 17$err_msg1 = ""; 18$err_msg2 = ""; 19$err_msg3 = ""; 20$message = ""; 21$name = (isset($_POST["name"]) === TRUE) ?$_POST["name"]:""; 22$comment = (isset($_POST["comment"]) === TRUE) ?trim($_POST["comment"]):""; 23$_POST["date"] = date('Y/m/d H:i:s'); 24$color = isset($_POST["color"]) ? $_POST["color"] : ''; 25$password = (isset($_POST["password"]) === TRUE) ?trim($_POST["password"]):""; 26 27//ここまで定義系 28 29 30//入力の判定と書き込み 31if(isset($_POST["send"]) === TRUE){ 32 if($name === "")$err_msg1 = '名前を入力してください'; 33 34 if($comment === "")$err_msg2 = 'コメントを入力してください'; 35 36 if($password === "" || mb_strlen($_POST["password"]) > 4 || !ctype_digit($_POST["password"])) 37 $err_msg3 = 'パスワードを4字以下の数字で設定してください'; 38 39 if($err_msg1 === "" && $err_msg2 === "" && $err_msg3 ===""){ 40 $fp2 = fopen("data.txt", "a+"); 41 $file = file("data.txt"); 42 $number = count($file)+1; 43 fwrite($fp2, $number."\t".$name."\t".$comment."\t".date('Y/m/d H:i:s')."\t".$color."\t".$password."\r\n"); 44 fclose($fp2); 45 $message = '書き込みに成功しました'; 46 } 47} 48//ここまでエラー文&ファイル書き込み 49 50//ファイル読み込み 51$fp3 = fopen("data.txt", "r"); 52 53$dataArr = array(); 54while($res = fgets($fp3)){ 55 $tmp = explode("\t", $res); 56 $arr = array( 57 "number"=>$tmp[0], 58 "name"=>$tmp[1], 59 "comment"=>$tmp[2], 60 "date"=>$tmp[3], 61 "color"=>$tmp[4], 62 "password"=>$tmp[5] 63 ); 64 65 $dataArr[] = $arr; 66} 67//ここまでファイル読み込み 68 69//削除機能 70if(isset($_POST["delete"]) === TRUE){ 71 $fp4 = fopen("data.txt", "r+"); 72 $file = file("data.txt"); 73 $sakujo = $_POST["sakujo"]; 74 $pass = $_POST["pass"]; 75 $pattern = "/^($sakujo).($pass)$/"; 76 77if(preg_match($pattern, $file) === 1){ 78 preg_replace($pattern, "", $file); 79 $message = '削除しました'; 80 }else{ 81 $message = '<font color="red">この投稿は削除できません</font>'; 82 } 83 fclose($fp4); 84} 85 86//ここまで削除機能 87$fp4 = fopen("data.txt", "r+"); 88$file = file("data.txt"); 89var_dump($file); 90fclose($fp4); 91?> 92 93<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.ong/TR/html4/loose.dtd"> 94<html lang="ja"> 95 <head> 96 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 97 <title>掲示板</title> 98 </head> 99 <body bgcolor="#9999FF"> 100 <table border="1"> 101 <tr><td><?php echo $count;?></td></tr> 102 </table> 103 <h1><center>一行掲示板</center></h1> 104 <h3><center>思いつくまま、一言メッセージをどうぞ。</center></h3> 105 <h5><center>パスワードを設定し自分の投稿を削除することができます。</center></h5> 106 <?php echo $message; ?> 107 <center><table border="2" bgcolor="#9999FF"> 108 <form action="" method="POST"> 109 <tr> 110 <td>名前</td><td><input type="text" name="name" value="<?php echo $name;?>"></td> 111 </tr> 112 <?php echo '<font color="red">'.$err_msg1.'</font>';?><br> 113 <tr> 114 <td>コメント</td><td><textarea name="comment" row="4" cols="40" value="<?php echo $comment;?>"></textarea></td> 115 </tr> 116 <?php echo '<font color="red">'.$err_msg2.'</font>';?><br> 117 118 <tr> 119 <td> 120 <label for="color">文字の色</label> 121 <select name="color"> 122 <option value="#000000" selected></option> 123 <option value="#FFFFFF"></option> 124 <option value="#FF0000"></option> 125 <option value="#0000FF"></option> 126 <option value="#00FF00"></option> 127 <option value="#660099"></option> 128 <option value="#FF3300"></option> 129 </select> 130 </td> 131 <td>パスワード<input type="password" name="password"></td> 132 <?php echo '<font color="red">'.$err_msg3.'</font>';?> 133 <td><input type="submit" name="send" value="クリック"></td> 134 </tr> 135 </form> 136 </table></center> 137 <br> 138 <hr> 139 <br> 140 <dl> 141 <?php foreach($dataArr as $data):?> 142 <p><span><?php 143 echo '['.$data["number"].']'; 144 ?></span> 145 <span> 146 <font color="<?php echo htmlspecialchars($data["color"], ENT_QUOTES, 'UTF-8');?>"> 147 <?php echo htmlspecialchars($data["name"], ENT_QUOTES, 'UTF-8');?> 148 </font> 149 </span> > <span> 150 <font color="<?php echo htmlspecialchars($data["color"], ENT_QUOTES, 'UTF-8');?>"> 151 <?php echo htmlspecialchars($data["comment"], ENT_QUOTES,'UTF-8');?> 152 </font> 153 </span> 154 <span>(<?php echo $data["date"];?>)</span> 155 </p> 156 <?php endforeach;?> 157 </dl> 158 <br> 159 <hr> 160 <br> 161 <center><table border="2" bgcolor="#9999FF"> 162 <form action ="" method="POST"> 163 <tr> 164 <td>投稿番号</td><td><input type="text" name="sakujo" required></td> 165 </tr> 166 <tr> 167 <td>パスワード</td><td><input type="password" name="pass" required></td> 168 </tr> 169 <tr><td></td> 170 <td><input type="submit" value="削除" name="delete"></td> 171 </tr> 172 </form></table></center> 173 </body> 174</html> 175

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

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

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

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

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

m.ts10806

2018/07/10 05:45

「うまく動作しない」「うまくいかない」では何が起きているか伝わりません。「○○のようになるはずなのに××となってしまう」のような形で「ゴール」と「現象(エラーメッセージなども含む)」を明確にしてください。https://teratail.com/help/question-tips#questionTips3-4-1
naberius

2018/07/10 05:51

ゴールはファイルの中からPOSTされた投稿番号とパスワードに一致する行を探して空白を挿入して削除することです。現象としてはエラー文は出ず投稿番号欄とパスワード欄の文字が消えて他は何も変わらないといった状態です。わかりづらくてすみません。
guest

回答3

0

ベストアンサー

いろいろ誤解されているソースに見えます。
まず、

PHP

1$fp4 = fopen("data.txt", "r+"); 2$file = file("data.txt"); 3var_dump($file); 4fclose($fp4);

このfopen()fclose()は必要ありません。file()で、内部でOpenとCloseを勝手にやってくれています。

次に、file()で取り出した値は、ファイル内部のポインタをリアルタイムに保持しているわけではなく、単に書き込まれているデータと同じものを配列にブチ込んでいるだけです。
なので

php

1$file = file("data.txt"); 2$file = null;

としても、ファイルの中身が空になるわけではありません。

やるとすると、$fileの中身を書き換えたあと、mode "w"でfopen()し、中身をごっそり書き換えると言う形ですかね。
ただ、これだとほぼ同時にアクセスされている方がいるとデータが壊れる(失われる)可能性もありますので、おすすめできません。

普通はDBを使うべき案件ですが、あえてファイルでやるとすると、投稿1つずつを1ファイルに格納する方がいいと思います。
/data/post/001.txt /data/post/002.txt ・・・など
投稿が増えると管理が大変ですが、そのあたりは最初に読み込むのは10件までとするなどして制御していくしかないですね。

ちなみに、TAB区切りやカンマ区切りのデータの読み書きについてはfputcsv() fgetcsv()などの便利な関数もあります。

投稿2018/07/10 06:18

編集2018/07/10 07:15
kunai

総合スコア5405

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

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

naberius

2018/07/10 06:27

なるほど・・・それでエラーは出ずとも機能しなかったんですね。 ありがとうございます。検討してみます。
guest

0

前回答者の内容を元に、「正規表現チェッカー」で、自分が望むチェックが出来ているか、調べながら試行錯誤するといいかもです。

http://okumocchi.jp/php/re.php

あと正規表現のマッチだけでは、該当ファイル行は消せないので、これも前回答者の内容通り、行ごと消したファイルを新たに一時的に作成しリネーム等するか、本ファイルを上書きするか、なりで、ロックを掛けて更新する必要がありますね。

投稿が同じタイミングだったので、前回答に便乗する形になってしまい、すみません。。

投稿2018/07/10 06:23

編集2018/07/10 06:29
SaintKnowledge

総合スコア368

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

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

naberius

2018/07/10 06:28

こんな便利なものがあったんですね! ありがとうございます!活用させていただきます!
SaintKnowledge

2018/07/10 06:34 編集

私が回答を書いている間にいろいろ更新があったようで、追記訂正しました。 「正規表現がうまくいかない」のではなく「投稿をファイルから消したい」という内容のようですので、これは正規表現だけの問題ではないです。 2番目に回答された方の回答も参考になると思います。
naberius

2018/07/10 06:35

そうですね。。。 どういう風にするか少し考えてみます。
guest

0

正規表現に関して

$pattern = "/^($sakujo)\t.+\t($pass)$/";

こんな感じでしょうか?

.は任意の1文字にしかマッチしないので.+として任意の文字列にマッチする必要があります。

また、 ($sakujo)\t としておかないと

1\t(name1)\t(comment1)\t(date1)\t(color1)\t(password) 10\t(name2)\t(comment2)\t(date2)\t(color2)\t(password)

というような場合に 10のほうも検索に引っかかってしまいます。

最後の ($password) 側も同様に \t($password)
passwordが test だった場合、このままだと t でも削除できてしまいます。

投稿2018/07/10 06:09

calkinos

総合スコア452

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

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

naberius

2018/07/10 06:17

タグとセットにする発想がなくて目から鱗でした!ありがとうございます! ただやはり投稿が消せなかったです。 正規表現だとできないってことはないですよね・・・?
calkinos

2018/07/10 06:34

kunaiさんの回答にもあるように、他に原因があります。 そちらを参考になさって、ファイルの書き換えで対応したい場合は https://teratail.com/questions/2451 などに既に回答がありますので参考にしてみてはいかがでしょう。
naberius

2018/07/10 06:38

ありがとうございます!参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問