php htmlタグの削除

2011/05/02

いくつか方法はあるけどそれなりに良い感じのが無かったので自作することにしてみた。

strip_tags(str)

[str]からHTMLのタグ的なものを削除。
※「<」から「>」までを削除。「>」がなければ最後まで削除。

strip_tags(str, allow)

[str]からHTMLのタグ的なものを削除するが、[allow]は削除しない。
「strip_tags($str, '<h1><h2><h3>')」だったら、「<h1><h2><h3>」を削除せずに他をすべて削除。

正規表現:preg_replace('/(<\/?)(\w+)([^<>]*>)/', '', $str)

「strip_tags()」と基本的に同じだけど「>」が無いと削除はしない。
※タグとは、「<」 or 「</」の次が、英数字が1回以上あり、「<」or「>」を除いた何かの文字が0回以上あり、「>」で終る。ただ、これだと<recatnap>みたいな存在しない内容も削除される。
※また、特定のタグのみ残すってのができない。

調整した関数「stripTags()」

正規表現を使ったものと基本は同じだけど、残すタグも指定することが可能。
※ただ…ヘタレな私は下記のような方法しか思いつかない…。

2つ目の引数に残すタグを配列にいれる。
※「getStrFromSelectWordToZero()」「getStrFromNumberToSelectWord()」は、以前どっかで拾った関数を自分なりカスタマイズしたもの。

  1. $str = 'あいうえお<h1>かきくけこ</h1><p>さしすせそ</p>';
  2.  
  3. echo stripTags( $str ) . "\n";
  4. // 結果は「あいうえおかきくけこさしすせそ」
  5.  
  6. echo stripTags( $str, array('H1') ) . "\n";
  7. // 結果は「あいうえお<h1>かきくけこ</h1>さしすせそ」
  8.  
  9. /**
  10. * stripTags() – 特定のタグとコメントを除いたタグの削除
  11. * @param str $str 対象のテキスト
  12. * @param ary $denys 削除しないタグ
  13. */
  14. function stripTags($str, $denys=array()){
  15.  // タグとコメントの基本パターン
  16.  $pt = '/(<\w+|<\/\w+|<\!\-\-)([^<>]*>)/iu';
  17.  
  18.  // 戻り値用
  19.  $replaceStr = "";
  20.  
  21.  $num = count( preg_split($pt, $str) ) – 1;
  22.  
  23.  // パターンにマッチする回数分ループ
  24.  for($i=0; $i<$num; $i++ ){
  25.  
  26.   // パターンにマッチする一つ目を取得
  27.   preg_match($pt, $str, $match);
  28.  
  29.   foreach($denys as $tag){
  30.    $denyPattern = '/(<\/?)(' . $tag . ')([^<>]*>)/iu';
  31.    if( preg_match($denyPattern, $match[0]) ){
  32.     // マッチした場合
  33.  
  34.     // 0文字目からマッチしたタグまで取得
  35.     $replaceStr .= getStrFromSelectWordToZero($str, $match[0], 'keep');
  36.  
  37.     //マッチしたタグ以降を取得
  38.     $str = getStrFromNumberToSelectWord($str, $match[0], 'del');
  39.  
  40.     // 1回処理したら以降の処理をせずにループを抜ける
  41.     continue 2;
  42.    }
  43.   }
  44.   // マッチしないものは削除
  45.   $str = preg_replace($pt, '', $str, 1);
  46.  }
  47.  // 残ったものを合体
  48.  $replaceStr .= $str;
  49.  
  50.  return $replaceStr;
  51. }
  52.  
  53. /**
  54. * getStrFromSelectWordToZero() – 0文字目から指定したKWの直後までを取得。
  55. * @param str $mySTR 検索元の文字列
  56. * @param str $findKW 検索するキーワード
  57. * @param str $copeKW 指定したKWの対処:[del]で削除。[keep]で残す。
  58. */
  59. function getStrFromSelectWordToZero($mySTR, $findKW, $copeKW){
  60.  
  61.  // $findKWが最初に出現する位置を探す
  62.  $pos = mb_strpos($mySTR, $findKW);
  63.  
  64.  if($pos === false){
  65.   // 検索KWが存在しない場合は何もしない
  66.   return $mySTR;
  67.  }
  68.  
  69.  // 検索するキーワードの対処
  70.  if( $copeKW == "del" ){
  71.   #$pos += mb_strlen($findKW);
  72.  }elseif( $copeKW == "keep"){
  73.   $pos += mb_strlen($findKW);
  74.  }
  75.  
  76.  // 指定した文字位置($pos)から$num文字を返す。
  77.  return mb_substr($mySTR, 0, $pos);
  78. }
  79.  
  80. /**
  81. * getStrFromNumberToSelectWord() – 指定したKWから$num文字取得する。
  82. * 指定したKWは文字数に含まれる。
  83. * @param str $mySTR 検索元の文字列
  84. * @param str $findKW 検索するキーワード
  85. * @param str $copeKW 指定したKWの対処:[del]で削除。[keep]で残す。
  86. * @param int $num 取得したい文字数:NULLで最後まで取得
  87. */
  88. function getStrFromNumberToSelectWord($mySTR, $findKW, $copeKW, $num=null){
  89.  
  90.  // $findKWが最初に出現する位置を探す
  91.  $pos = mb_strpos($mySTR, $findKW);
  92.  
  93.  if($pos === false){
  94.   // 検索KWが存在しない場合は何もしない
  95.   return $mySTR;
  96.  }
  97.  
  98.  // 検索するキーワードの対処
  99.  if( $copeKW == "del" ){
  100.   $pos += mb_strlen($findKW);
  101.  }elseif( $copeKW == "keep"){
  102.  }
  103.  
  104.  // 文字数の指定がない場合($num == NULL)、最後まで表示。
  105.  if( $num == NULL ){
  106.   $num = mb_strlen($mySTR) – $pos;
  107.  }
  108.  
  109.  // 指定した文字位置($pos)から$num文字を返す。
  110.  return mb_substr($mySTR, $pos, $num);
  111. }

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい