重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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('&lt;p&gt;' ,'&lt;/p&gt;','&lt;imgsrc=&quot;','&lt;ahref=&quot;','&quot;&gt;');
$replace = array('<p>','</p>','<img src="','<a href="','">');
return str_replace($search,$replace,$s);
}

【表示】
<?=nl2br(s(h($content))?><br>

※関数hとs ・nl2brは一つにまとめて関数にできますが、表示するものの用途によっては変更したいので、バラバラに書いていますのでちょっと汚い書き方かもれません。

A 回答 (3件)

自分で書いておいて申し訳ないのですが、ちょっと複雑なのでstr_replaceよりは


preg_replaceのほうが良いかも

また、htmlspecialcharsするときできればENT_NOQUOTES指定してあげてください

function h($s) {
return htmlspecialchars($s, ENT_NOQUOTES, 'utf-8');
}

function s($s){
$pattern="/&lt;((a|img|p) .+?|\/(a|p)| .+?|p)&gt;/";
$replacement="<$1>";
return preg_replace($pattern,$replacement,$s);
}
    • good
    • 0
この回答へのお礼

ありがとうございます。感謝いたします。
3種類の使い方の例を書いていただいたのでかなり勉強になります。ENT_QUOTESばかり使っていましたが、
実際にうごかして違いを確認したわけではないので、よくわかっていませんでした。
またhtmlspecialchars_decode関数は知らなかったので、とても新しい発見でした。ありがとうございます。
関数の中に関数を入れるという書き方をしたことがなかったので、こちらもとても参考になります。

3つ全てためしています。
#2と#3のほうが私の環境では、Catchable fatal error: Object of class Closure could not be converted to string in~ で最後の句が指摘されます。文字列に変換できないみたいなエラーがでます。原因を確認しています。もし分からなかったらさいど投稿します。

お礼日時:2016/06/01 10:40

たびたびすみません。


よく考えたらふつうにマッチした文字をデコードするだけですね

function s($s){
$pattern="/&lt;((a|img|p) .+?|\/(a|p)|p)&gt;/";
$replacement=function($a){return htmlspecialchars_decode($a[0],ENT_QUOTES);};
return preg_replace($pattern,$replacement,$s);
}
    • good
    • 0
この回答へのお礼

ありがとうございます。htmlspecialchars_decode関数を知らなかったので、とても参考になりました。

お礼日時:2016/06/01 10:41

あ、#1の


$pattern="/&lt;((a|img|p) .+?|\/(a|p)| .+?|p)&gt;/";
はこうしてください
$pattern="/&lt;((a|img|p) .+?|\/(a|p)|p)&gt;/";

で、一応、ENT_QUOTESだったときのs()も書いときます

function s($s){
$pattern="/&lt;((a|img|p) .+?|\/(a|p)|p)&gt;/";
$replacement=function($a){return str_replace(array("&lt;","&gt","&quot;","&#039;"),array("<",">","\"","'"),$a[0]);};
return preg_replace($pattern,$replacement,$s);
}
    • good
    • 0
この回答へのお礼

ありがとうございます。違いが分かるのでとても勉強になりました。

お礼日時:2016/06/01 10:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!