• 締切済み

phpの掲示板でタグ使用

現在掲示板を作っているのですが、fontタグを使用できるようにしたいです。 $_POST['MESSAGE']が本文で、 置き換え部分のソースは、 $_POST['MESSAGE'] = str_replace('"', "&quot;", $_POST['MESSAGE']); $_POST['MESSAGE'] = str_replace("<", "&lt;", $_POST['MESSAGE']); $_POST['MESSAGE'] = str_replace(">", "&gt;", $_POST['MESSAGE']); $_POST['MESSAGE'] = str_replace(array("\r\n","\r","\n"), " <br> ", $_POST['MESSAGE']); となっています。 これを改造してタグが使えるようになりませんか?

  • PHP
  • 回答数2
  • ありがとう数1

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

一旦 全ての<>を&lt;&gt; に変換しておいて、この変換には htmlspecialchars() を使った方が4回もreplaceを実行するよりよいと思いますけど。 次に、正規表現で &lt;font size="7"&gt;を<font size="7">に戻すことになると思います。 $origin = htmlspecialchars($_POST['MESSAGE'] ); $pattern = array('/&lt;(font\\s+size=[\"\'][1-7][\"\'])\\s*&gt;/i', '/&lt;\/fontgt;/i'); $replace = array('<$1>', '</font>'); $result = preg_replace($pattern,$replace, $origin ); fontタグでもonclick などのJavascriptが動作したか忘れましたけど、タグの属性部分に危険なJavascriptを仕込まれないようにするには、有効なタグの書式として一定の縛りを入れるべきでしょう。 上記では、size属性のみで属性値は数値のみとなります。 でも、実行チェックはしてないので、正規表現に誤りがあったら済みません、適宜修正して下さい。

kenken3paa
質問者

お礼

正規表現を使うんですか。 このスクリプトでは動きませんでしたが、学習したいと思います。 ありがとうございました。

  • swqamy
  • ベストアンサー率37% (11/29)
回答No.1

質問ですが、fontタグを追加する文字列は固定なのですか? たとえば、$_POST['MESSAGE'] の内容が「ABCDEFG」でタグを追加したい文字列が「D」の場合は $_POST['MESSAGE'] = str_replace('D', "<font>D</font>", $_POST['MESSAGE']); で出来ると思いますが str_replace('D', "<font>D</font>", $_POST['MESSAGE']);        ↑       この部分(D)が固定でない場合は難しいと思います

kenken3paa
質問者

補足

$_POST['MESSAGE']は、投稿内容で、 投稿者が、 >ひらけんっておもしろいよな そうそう。<font size=7>ほんと</font>おもしろいな と投稿した場合に、最初の>は&gt;に変換して、fontタグの<と>は変換せずに出力したいわけです。

関連するQ&A

  • MySQLにHTMLタグを挿入したい

    PHPでつくった登録フォームよりhtmlタグを入力してそれをtext型のフィールドにhtmlタグごと入れたいのですが、うまくいいようにはいりません。 入力 <table border="0" width="80%"><tr>問1 磁気ディスク装置において,磁気ヘッドをある位置から目的の位置に移動させるのに要する時間を何と呼ぶか。</tr><tr> <td><input type="radio" name="1" value="ア">ア  アクセス時間</td><td><input type="radio" name="1" value="イ">イ  サーチ時間</td><td><input type="radio" name="1" value="ウ">ウ  シーク時間</td><td><input type="radio" name="1" value="エ">エ  データ転送時間</td></tr></table><br><hr width="80%"><br> フィールドの保存データ &lt;table border=&quot;0&q uot; width=&quot;80%&quot;&gt;&lt;tr&gt;問1 磁気ディスク装置において,磁気ヘッ ドをある位置から目的の位置に移動させるのに要する時間を何と呼ぶか。&lt;/tr&gt;&lt ;tr&gt; &lt;td&gt;&lt;input type=&quot;radio&quot; name=&quot;1&quot; value=&qu ot;ア&quot;&gt;ア  アクセス時間&lt;/td&gt;&lt;td&gt;&lt;input type=&quot;radio &quot; name=&quot;1&quot; value=&quot;イ&quot;&gt;イ  サーチ時間&lt;/td&gt;&lt ;td&gt;&lt;input type=&quot;radio&quot; name=&quot;1&quot; value=&quot;ウ&quot;& gt;ウ  シーク時間&lt;/td&gt;&lt;td&gt;&lt;input type=&quot;radio&quot; name=&q uot;1&quot; value=&quot;エ&quot;&gt;エ  データ転送時間&lt;/td&gt;&lt;/tr&gt;&l t;/table&gt;&lt;br&gt;&lt;hr width=&quot;80%&quot;&gt;&lt;br&gt; と入ってしまい データベースを参照してhtmlを表示したときには <table border="0" width="80%"><tr>問1 磁気ディスク装置において,磁気ヘッドをある位置から目的の位置に移動させるのに要する時間を何と呼ぶか。</tr><tr> <td><input type="radio" name="1" value="ア">ア  アクセス時間</td><td><input type="radio" name="1" value="イ">イ  サーチ時間</td><td><input type="radio" name="1" value="ウ">ウ  シーク時間</td><td><input type="radio" name="1" value="エ">エ  データ転送時間</td></tr></table><br><hr width="80%"><br> と表示されうまくいきません。

  • PHPです2つのスクリプトの相違がわかりません

    PHPですが、以下の2つのスクリプトで同じ結果がでると思ったのですが現実は違いました。 henkan.php <html> <body> <?php $uketori=$_POST['UKETORI']; $uketori=str_replace("pen","pencil", $uketori); $uketori=strtoupper($uketori); print "$uketori"; ?> </body> </html> henkan2.php <?php $str=$_POST['UKETORI']; echo str_replace("です。","だよん。", $str) . "<br>\n"; echo "<br>\n"; echo mb_ereg_replace("です。","だよん。", $str) . "<br>\n"; echo "<br>\n"; ?> フォームに です。 という文字を入れたら変換されて だよん。 と表示さしたいのですが、上の2つで相違がでました。なぜなんでしょうか。 henkan.php では変換されませんでした。 henkan2.php では変換されました。

    • ベストアンサー
    • PHP
  • タグの不等号処理

    ただいまperlにて掲示板を製作中です。PC上でApacheを使いチェック中なのですが、タグなどで仕様する不等号を変換することが出来ません。下記のように処理しているのですが、なぜか変換されません。 foreach (@data){ s/&/&amp;/g; s/>/&gt;/g; s/</&lt;/g; s/"/&quot;/g; s/\r\n/\<br\>/g; s/\n/\<br\>/g; } ちなみにs/&/&amp;/g;の[&amp;]の部分を[AA]等に変更すると 問題なく[&]は[AA]に変更されます。 なぜなのでしょうか?表示時にタグとして認識されてしまい困っております。どうかご教授下さい。

    • ベストアンサー
    • CGI
  • PHPで作る掲示板について

    これを実行するとページは表示されるのですが、名前や題名、本文に日本語を入力すると 例えば名前に「山田」と入れ送信すると投稿者のところに何も出ません どうすれば解決できますか?環境はWin7でサーバは用意されたものを使用しているので 設定等の必要はありません。 画像は上が送信前、下が送信後です <?php $lines = file('bbs2.txt'); if ($_POST['write']) { $items = explode("\t", $lines[0]); $no = $items[0] + 1; $name = htmlspecialchars($_POST['name']); if (!$name) $name = "名無しさん"; $mail = htmlspecialchars($_POST['mail']); $title = htmlspecialchars($_POST['title']); if (!$title) $title = "無題"; $contents = htmlspecialchars($_POST['contents']); $contents = str_replace("\r\n", "<br>", $contents); $contents = str_replace("\r", "<br>", $contents); $contents = str_replace("\n", "<br>", $contents); $delkey = htmlspecialchars($_POST['delkey']); $time = date("Y/m/d H:i:s"); $expire = time() + 3600 * 24 * 30; setcookie("name", $name, $expire); setcookie("mail", $mail, $expire); setcookie("delkey", $delkey, $expire); $data = "$no\t$name\t$mail\t$title\t$contents\t$delkey\t$time\n"; array_unshift($lines, $data); } else { $name = $_COOKIE['name']; $mail = $_COOKIE['mail']; $delkey = $_COOKIE['delkey']; } if ($_POST['delete']) { for ($i = 0; $i < count($lines); $i++) { $items = explode("\t", $lines[$i]); if ($items[0] == $_POST['delno'] && $items[5] == $_POST['delkey2']) { array_splice($lines, $i, 1); } } } if ($_POST['write'] || $_POST['delete']) { $fp = fopen('bbs2.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>掲示板2</title> </head> <body> <form method="post" action="bbs2.php"> お名前:<input type="text" name="name" value="<?php print $name ?>"><br> メール:<input type="text" name="mail" value="<?php print $mail ?>"><br> 題 名:<input type="text" name="title"><br> 削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br> <textarea name="contents" cols="60" rows="5"></textarea><br> <input type="submit" name="write" value="送信"> <hr> 記事番号:<input type="text" name="delno">  削除キー: <input type="password" name="delkey2">  <input type="submit" name="delete" value="記事削除"> </form> <hr> <?php foreach($lines as $line) { $line = rtrim($line); $items = explode("\t", $line); print "No.{$items[0]} "; print "<b>{$items[3]}</b> 投稿者:"; if ($items[2]) print "<a href='mailto:{$items[2]}'>"; print $items[1]; if ($items[2]) print "</a>"; print " 投稿時間:{$items[6]}"; print "<p>{$items[4]}</p><hr>\n"; } ?> </body> </html>

    • 締切済み
    • PHP
  • PHPで作る掲示板のプログラムについて

    これを実行するとページは表示されるのですが、名前や題名、本文に日本語を入力すると 例えば名前に「山田」と入れ送信すると投稿者のところに何も出ません どうすれば解決できますか? <?php $lines = file('bbs2.txt'); if ($_POST['write']) { $items = explode("\t", $lines[0]); $no = $items[0] + 1; $name = htmlspecialchars($_POST['name']); if (!$name) $name = "名無しさん"; $mail = htmlspecialchars($_POST['mail']); $title = htmlspecialchars($_POST['title']); if (!$title) $title = "無題"; $contents = htmlspecialchars($_POST['contents']); $contents = str_replace("\r\n", "<br>", $contents); $contents = str_replace("\r", "<br>", $contents); $contents = str_replace("\n", "<br>", $contents); $delkey = htmlspecialchars($_POST['delkey']); $time = date("Y/m/d H:i:s"); $expire = time() + 3600 * 24 * 30; setcookie("name", $name, $expire); setcookie("mail", $mail, $expire); setcookie("delkey", $delkey, $expire); $data = "$no\t$name\t$mail\t$title\t$contents\t$delkey\t$time\n"; array_unshift($lines, $data); } else { $name = $_COOKIE['name']; $mail = $_COOKIE['mail']; $delkey = $_COOKIE['delkey']; } if ($_POST['delete']) { for ($i = 0; $i < count($lines); $i++) { $items = explode("\t", $lines[$i]); if ($items[0] == $_POST['delno'] && $items[5] == $_POST['delkey2']) { array_splice($lines, $i, 1); } } } if ($_POST['write'] || $_POST['delete']) { $fp = fopen('bbs2.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>掲示板2</title> </head> <body> <form method="post" action="bbs2.php"> お名前:<input type="text" name="name" value="<?php print $name ?>"><br> メール:<input type="text" name="mail" value="<?php print $mail ?>"><br> 題 名:<input type="text" name="title"><br> 削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br> <textarea name="contents" cols="60" rows="5"></textarea><br> <input type="submit" name="write" value="送信"> <hr> 記事番号:<input type="text" name="delno">  削除キー: <input type="password" name="delkey2">  <input type="submit" name="delete" value="記事削除"> </form> <hr> <?php foreach($lines as $line) { $line = rtrim($line); $items = explode("\t", $line); print "No.{$items[0]} "; print "<b>{$items[3]}</b> 投稿者:"; if ($items[2]) print "<a href='mailto:{$items[2]}'>"; print $items[1]; if ($items[2]) print "</a>"; print " 投稿時間:{$items[6]}"; print "<p>{$items[4]}</p><hr>\n"; } ?> </body> </html>

    • 締切済み
    • PHP
  • 改行コードの<BR>への変換がうまくいきません。

    はじめまして よろしくお願いします。 仕事でPHPを触れはじめたところです。 textarea タグで入力されたものをMysqlに保管し、 また表示するというようなものを作ろうとしています。 困っているのは Mysqlがどうのではなくその登録前に 改行コードを <br>タグ に変換をかけておこうというところで躓いています。 セッションを開始しておいてFormタグからの値を 次のページで受け取っています。 ここの過去ログ等を参考にしてみたのですが... $_SESSION['e_biko'] = htmlspecialchars($_POST['biko'] , ENT_QUOTES) ; $tmp_biko = ""; $tmp_biko = str_replace("\r\n", "\r", $_SESSION['e_biko']); $tmp_biko = str_replace("\r", "\n", $tmp_biko); $_SESSION['e_biko'] = str_replace("\n", "<br>", $tmp_biko); このあとでechoを使って$_SESSION['e_biko'] を表示させています。 しかし改行しないんです。<BR>タグへの変換ができておらず、表示されたHTMLのソースコードを見ると改行コードがそのまま出力されています。 HTML及びPHPの文字コードはEUCで記述しています。 開発及び確認はWindows・IE6で行っています。 何か考えられる原因、あるいはバグかあるでしょうか? ちなみに下記でも駄目でした。 $_SESSION['e_biko'] = preg_replace("/\r\n|\r|\n/", "<br>", $_SESSION['e_biko']); お分かりになられる方おられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ホームページビルダー でアフィリエイトのサイト

    ビルダーでアフィリエイトのサイトを作りたいのですが ページに楽天からのテンプレート貼り付けしたのですが ここからやり方がわかりません ★★★ ここにアフィリエイト用の画像のソースを入れる ★★★<BR> <BR> &lt;/td&gt;<BR> &lt;/tr&gt;<BR> &lt;tr&gt;<BR> &lt;td&gt;&lt;font size=&quot;-1&quot;&gt;<BR> <BR> ★★★ ここにアフィリエイト用のテキストリンクのソースを入れる ★★★<BR> &lt;br&gt;<BR> ★★★ ここに紹介文を入れる ★★★<BR> &lt;br&gt; はりつけたあとどうしたらいいのですか?

  • 改行処理がうまくいきません

    今現在、PHPで掲示板を運用しています。 PHP初心者です。 掲示板で訪問者のユーザーのコメントを以下のように処理しています。 $post_arr[$h] = htmlspecialchars($post_arr[$h]); $post_arr[$h] = str_replace("\r\n", "\r", $post_arr[$h]); $post_arr[$h] = str_replace("\r", "\n", $post_arr[$h]); $post_arr[$h] = str_replace("\n", "<br>", $post_arr[$h]); 改行→<br>変換を行っているのですが、ごくたまに(特定の訪問者)改行処理がされず困っています。 これをcsvでログを保存しているのですが、<br>処理をされずデータがずれてしまいます。 ログを調べるとその訪問者の方は、古いものをお使いなのかなと思いましたが、WIN XP,IE6でしたので訪問者側に問題ないと思うのですが。 初心者で大変恐縮ですが、ご返答よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 掲示板へ英語による書き込みを弾く設定について

    現在"PHPBB"というフォーラムスクリプトを運営しております しかし、このスクリプトを狙った海外からのスパマーが多く 困っております そこで、投稿の際にひらがなが含まれない 投稿はブロックするようにしました 記述は以下のようになります # check word $chkmsg = ( !empty($HTTP_POST_VARS['message']) ) ? $HTTP_POST_VARS['message'] : ''; if (strlen($chkmsg) != 0) { if (mb_convert_kana($chkmsg, "C") == $chkmsg) { message_die(GENERAL_MESSAGE, "ひらがなが見当たりません<br>詳細は master にお問合せください"); } $chkword = @file("chkword.txt"); foreach ($chkword as $line) { $line = str_replace("\r", "" , $line); $line = str_replace("\n", "" , $line); if (strlen($line) == 0) { continue; } if (substr_count($chkmsg, $line)) { $chkresult = true; } } if ($chkresult) { message_die(GENERAL_MESSAGE, "禁止ワードが含まれています<br>詳細は master にお問合せください"); } } # これによって、本文にひらがなが含まれない投稿はブロックできるようになりましたが、 わずかにひらがなを含む投稿も2~3日に一件ほどあるので 条件を変更し、”本文の50%以上が英語の書き込みを拒否”という形にしたいのですが これは可能でしょうか? もし、可能であればどのように記述すればよいのでしょうか? ちなみにこのフォーラムのURLはhttp://www.be-emotion.com/seo/forum/です よろしくお願いします

    • ベストアンサー
    • PHP
  • フォームで受け取った文章$strを

    HTML形式に直すには $str=~s|\r\n|<br/>|sg; $str=~s|\n|<br/>|sg; $str=~s|\r|<br/>|sg; $str=~s|\s|&nbsp;|sg; $str=~s|<|&lt;|g; $str=~s|>|&gt;|g; $str=~s|&|&amp;|g; でいいのでしょうか? 何か抜けや誤りはないでしょうか? \tの変換ができないのが残念ですが空白にしたつもりです

    • ベストアンサー
    • Perl

専門家に質問してみよう