
htmlspecialchars関数でエスケープしたものをstr_replace関数で指定した文字だけ有効なものに置き換えたいと考えています。下記のように関数で定義しました。一つ目の関数で、エスケープし、2つ目の関数で指定したタグを許可します。この2つ目の関数のときに、<p></p>を有効にすることは可能なのですが、<img src="">や、<a href="">を置き換えるときに、うまくいきません。特殊文字の表記に問題があるのでしょうか?
【関数】
function h($s) {
return htmlspecialchars($s, ENT_QUOTES, 'utf-8');
}
function s($s){
$search = array('<p>' ,'</p>','<imgsrc="','<ahref="','">');
$replace = array('<p>','</p>','<img src="','<a href="','">');
return str_replace($search,$replace,$s);
}
【表示】
<?=nl2br(s(h($content))?><br>
※関数hとs ・nl2brは一つにまとめて関数にできますが、表示するものの用途によっては変更したいので、バラバラに書いていますのでちょっと汚い書き方かもれません。
No.1ベストアンサー
- 回答日時:
自分で書いておいて申し訳ないのですが、ちょっと複雑なのでstr_replaceよりは
preg_replaceのほうが良いかも
また、htmlspecialcharsするときできればENT_NOQUOTES指定してあげてください
function h($s) {
return htmlspecialchars($s, ENT_NOQUOTES, 'utf-8');
}
function s($s){
$pattern="/<((a|img|p) .+?|\/(a|p)| .+?|p)>/";
$replacement="<$1>";
return preg_replace($pattern,$replacement,$s);
}
ありがとうございます。感謝いたします。
3種類の使い方の例を書いていただいたのでかなり勉強になります。ENT_QUOTESばかり使っていましたが、
実際にうごかして違いを確認したわけではないので、よくわかっていませんでした。
またhtmlspecialchars_decode関数は知らなかったので、とても新しい発見でした。ありがとうございます。
関数の中に関数を入れるという書き方をしたことがなかったので、こちらもとても参考になります。
3つ全てためしています。
#2と#3のほうが私の環境では、Catchable fatal error: Object of class Closure could not be converted to string in~ で最後の句が指摘されます。文字列に変換できないみたいなエラーがでます。原因を確認しています。もし分からなかったらさいど投稿します。
No.3
- 回答日時:
たびたびすみません。
よく考えたらふつうにマッチした文字をデコードするだけですね
function s($s){
$pattern="/<((a|img|p) .+?|\/(a|p)|p)>/";
$replacement=function($a){return htmlspecialchars_decode($a[0],ENT_QUOTES);};
return preg_replace($pattern,$replacement,$s);
}
No.2
- 回答日時:
あ、#1の
$pattern="/<((a|img|p) .+?|\/(a|p)| .+?|p)>/";
はこうしてください
$pattern="/<((a|img|p) .+?|\/(a|p)|p)>/";
で、一応、ENT_QUOTESだったときのs()も書いときます
function s($s){
$pattern="/<((a|img|p) .+?|\/(a|p)|p)>/";
$replacement=function($a){return str_replace(array("<",">",""","'"),array("<",">","\"","'"),$a[0]);};
return preg_replace($pattern,$replacement,$s);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- Excel(エクセル) Excelの社員名簿 6 2023/07/10 16:35
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- Access(アクセス) Accessのクエリで、replace関数を使い、データの中にある”をブランクに置き換えたいのですが 6 2022/06/15 14:54
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
○分から○時間○分に変換
-
文字列の置換をCStringで(C++)
-
正規表現で<BR>の行を除外した...
-
VBAのコマンドボタンの文字列の...
-
全角括弧と全角読点の間隔を狭...
-
文字の入力で横バー上段、中断...
-
Excel VBAからBeckyを起動して...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
エクセルのCOUNTIFが正しくカウ...
-
グレープシティのSPREAD...
-
文字化け変換方法
-
C++でのCRLFについて
-
ASP.net(C#) CheckBoxListで...
-
バーコード入力と手入力の判断...
-
Replace関数は文字数の制限ある...
-
Excel関数「COUNTIF」で”文字”...
-
バッチファイル 全角検索
-
最終行の改行について
-
テキストボックスに改行を含む...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
文字列の置換をCStringで(C++)
-
文字列の括弧について(初心者)
-
c# string型の変数に、ダブルク...
-
VBSで"をエスケープする文字は?
-
○分から○時間○分に変換
-
入力文字に\\マークが入ってい...
-
mcryptで英数字(12未満)のみに...
-
マクロ関数 #define の効果は何...
-
正規表現
-
VB.NET 文字コード
-
PHPでCSVを出力する際のセルに...
-
PHPでjavascriptを書き出すとき...
-
ヒットする初回のみ置換する方法
-
文字列のアスタリスク置換
-
php 正規表現で、\\マークを取...
-
正規表現について
-
PHP VS Java (パフォーマン...
-
sedでの最短一致の書き方
-
正規表現での記述方法
おすすめ情報