プロが教えるわが家の防犯対策術!

こんにちは。

今、ホームページで下記のようにPHPを使っています。
mb_encode_numericentity("内容ないようナイヨウ", array(0, 0x10FFFF, 0, 0x10FFFF), 'UTF-8'));

ただこれだと、例えば下記にした場合は<p class="className">と</p>までも変換されてしまいます。
mb_encode_numericentity("内容ないよう<p class=\"className\">ナイヨウ</p>", array(0, 0x10FFFF, 0, 0x10FFFF), 'UTF-8'));

これをどうにかされられないかとmb_encode_numericentityの第二引数を考えているのですが分かりません。用は開くタグと閉じるタグだけはそのままにしたいのです。

そのような高級なことは可能でしょうか?

お知恵をお貸し下さい。

質問者からの補足コメント

  • yambejpさん、早速のご返事ありがとうございます。

    試してみたいと思います。まずはお礼まで。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/06/04 19:56

A 回答 (2件)

つかっている$convmapと$encodingが一緒なので、まとめたほうがよいかも



function test3($str)
{
$convmap=array(0, 0x10FFFF, 0, 0x10FFFF);
$encoding="UTF-8";
$pattern="/<.*?>|[\r\n]+/";
if(preg_match_all($pattern,$str,$matches)){
$datas=preg_split($pattern,$str);
array_walk($datas,function (&$item) use($convmap,$encoding){$item=mb_encode_numericentity($item, $convmap, $encoding);});
$str2=implode("%s",$datas);
$str2=vsprintf($str2,$matches[0]);
}else{
$str2=mb_encode_numericentity($str, $convmap, $encoding);
}
return $str2;
}

じっさいのところ、preg_replace_callback()でやる方が簡単にできそうなのですが
ちょっと書き方がめんどくさそうなのでご提示の処理になっています。
    • good
    • 0
この回答へのお礼

yambejpさん、再度のご回答ありがとうございます。

preg_replace_callback()関数ですか…難しそうですね。ちょっと試してみたいと思います。ご提示の方法なんて思いも付きませんでしたし、思いついたとしても出来ませんでした。

本当にありがとうございました。

お礼日時:2015/06/04 23:40

正しいやり方があるかどうかわかりませんが、


無理やりならこんな感じでもいけるのでは?

(1)タグで分割→タグはとっておく
(2)配列の各要素をエンコードする
(3)配列をセパレータを%sで文字列にもどす
(4)printf処理

<?PHP
$str="内容ないよう<p class=\"className\">ナイヨウ</p>";
$pattern="/<.*?>/";
if(preg_match_all($pattern,$str,$matches)){
$datas=preg_split($pattern,$str);
$convmap=array(0, 0x10FFFF, 0, 0x10FFFF);
$encoding="UTF-8";
array_walk($datas,function (&$item) use($convmap,$encoding){$item=mb_encode_numericentity($item, $convmap, $encoding);});
$str=implode("%s",$datas);
$str=vsprintf($str,$matches[0]);
}
print $str;
?>
この回答への補足あり
    • good
    • 0
この回答へのお礼

yambejpさんありがとうございます。

ご提示の方法、試してみました。出来ました!ただタグが文字列に無かった場合は反映されなかったので、下記のようにyambejpさんの方法と私がタグを用いてない時にやっていた方法に分けてみたのですが、まずご覧下さい。

<?php
 function test3($str){
  $pattern="/<.*?>/";
  if(preg_match_all($pattern,$str,$matches)){
   $datas=preg_split($pattern,$str);
   $convmap=array(0, 0x10FFFF, 0, 0x10FFFF);
   $encoding="UTF-8";
   array_walk($datas,function (&$item) use($convmap,$encoding){$item=mb_encode_numericentity($item, $convmap, $encoding);});
   $str=implode("%s",$datas);
   $str=vsprintf($str,$matches[0]);
   print $str;
  }else{//このelseが私がやっていた方法です。
   echo str_replace("amp;", "", mb_encode_numericentity("$str", array(0, 0x10FFFF, 0, 0x10FFFF), 'UTF-8'));
  }
 }
?>

私のサイトはhtml内に下記のように一文一文表記しているスタイルです。
------------------
<?php test3("内容ないよう<p class=\"className\">ナイヨウ</p>");?>
<?php test3("内容ないよう");?>
~~~
<?php test3("スーパー内容スーパーないよう<p class=\"className\">ナイヨウ</p>");?>
------------------
こんな風にした場合、外部ファイルにtest3関数を表記する場合のウェブパフォーマンスとしてどのように思われますでしょうか?

もし良いスタイルがありましたら御教示願えないでしょうか?

お礼日時:2015/06/04 20:41

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