- PR -

PHPでのエスケープシーケンスについて

1
投稿者投稿内容
ばなな
ベテラン
会議室デビュー日: 2005/06/16
投稿数: 91
投稿日時: 2005-09-21 13:22
PHPについてご指導お願いいたします。
PHPでの文字列をHTMLで表示する場合、
変換関数をつかわないと「>」等によって画面がくずれるので
htmlspecialchars関数で変換してHTMLに表示しました。
しかしブルクォーテーション、¥マークの場合、前にどうしても¥がつきます。
これをどうにか¥だけはずしたいのですが、そうしたらいいのかわかりません。
ご指導お願いいたします。

[ メッセージ編集済み 編集者: ばなな 編集日時 2005-09-21 16:58 ]
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-09-21 13:48
str_replaceで空文字列に変換すればいいですよ。

(ってか、マニュアルに一通り目を通す事オヌヌメ)
ばなな
ベテラン
会議室デビュー日: 2005/06/16
投稿数: 91
投稿日時: 2005-09-21 14:45
ご指導ありがとうございます。
str_replace関数で\を空文字に置換すると
「¥"」→「"」 でいいのですが
「¥」文字だと置換されて表示できないですよね?

[ メッセージ編集済み 編集者: ばなな 編集日時 2005-09-21 14:46 ]
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-09-21 15:42
引用:

ばななさんの書き込み (2005-09-21 14:45) より:
「¥"」→「"」 でいいのですが
「¥」文字だと置換されて表示できないですよね?


ン?「¥」だと置換されるってのなら「¥¥」を置換すればいいだけでは?

(ってか、もちっとマニュアル見てれば、htmlentitiesに引っかかったと思うんだけど。)

後、先ほど書き忘れてたけど「件名:wekasp9228」が意味不明。
----------
「件名:wekasp9228」ってなんじゃぁ?を追加。

[ メッセージ編集済み 編集者: 冬寂 編集日時 2005-09-21 15:46 ]
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-09-21 15:46
htmlspecialcharsで変換する前の値自体がエスケープされているんじゃないでしょうか?
php.iniとか .htaccessで magic_quotes_gpcが有効にしていないですか?
phpinfo()で確認してみてはいかがでしょうか.

htmlspecialcharsで変換を行うと通常は "や\は以下のようになります。

コード:
$str='"\';
$str=htmlspacialchars($str, ENT_QUOTES);



となっていた場合は $strには「"\」がはいります。

コード:
$str='"\';
$str=htmlspacialchars($str, ENT_NOQUOTES);



なら$strには「"\」がはいります。


このデータの発生元は何でしょうか?DBですか?クライアントからの文字列ですか?
DBだった場合はインサートのクエリーで既にmagic_quotes_gpcが有効なためにエスケープされているものをさらにaddslashesとかしてしまったりしてませんか?

そうであった場合はDBの中身を見るとおかしなデータになっていると思います。
一応 addslashesの逆関数のstripslashesで復活できますが...

クライアントからの文字列がmagic_quotes_gpcでエスケープされているものを戻すサンプルコード
コード:
foreach($_POST as $key => $val){
  $_POST[$key] = stripslashes($val);
}



<pre></pre>などのタグを使用して変換する前のデータ等を追ってみたらいいと思います。
ばなな
ベテラン
会議室デビュー日: 2005/06/16
投稿数: 91
投稿日時: 2005-09-21 16:58
冬寂さん、jkさんご指導ありがとうございます。
■冬寂さんへ
htmlentitiesで変換しても結果は一緒です。(文字列内全てHTMLエンティティに変換しますが)
¥を全て表示させない場合、置換という方法がよいかもしれませんが、
”→ ¥”
¥→ ¥¥
¥”は「¥」のみを置換、¥¥の場合「¥¥」で置換する方法は少々面倒かと思います。
(エスケープシーケンスは複数ありますので)
タイトルが変になっておりました。ごめんなさい。

■jkさんへ
ご指摘のとおり
magic_quotes_gpcが有効になっておりました。
<pre>で表示させたところ エスケープシーケンスで表示されておりました。
stripslashesで解決いたしました。
ありがとうございます<(_ _)>
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-09-21 17:28
余談ですがこんなコードを私は使っております。

コード:

$debug_flag = true; // release時はfalse にする

function debug($file,$line,$arg)
{
global $debug_flag;

if (!$debug_flag)return;

print $file."(". $line .")<br>";
if (is_object($arg) || is_array($arg)){
print "<pre>\n";
print_r($arg);
print "</pre>\n";
}else{
print "<pre>\n";
print $arg ."\n";
print "</pre>\n";
}
}



こいつを lib.incのようなファイル名でよく使う自作ライブラリを集めて
phpの最初で include('lib.inc');

デバックしたい箇所で

debug(__FILE__, __LINE__, $_POST); として使ってます。
release時に $debug_flag=false; にすればデバッグコードが取りきれていなくても不要な情報が出力されることがないので便利。


[ メッセージ編集済み 編集者: jk 編集日時 2005-09-21 17:28 ]

[ メッセージ編集済み 編集者: jk 編集日時 2005-09-21 17:29 ]
ばなな
ベテラン
会議室デビュー日: 2005/06/16
投稿数: 91
投稿日時: 2005-09-21 17:54
PHPについてのさらなるご教授ありがとうございます。<(_ _)>
PHPを初めたばかりでマニュアルやネットで調べながら勉強している次第です(^▽^
大変参考になります。ありがとうございました。<(_ _)>
1

スキルアップ/キャリアアップ(JOB@IT)