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()」は、以前どっかで拾った関数を自分なりカスタマイズしたもの。
- $str = 'あいうえお<h1>かきくけこ</h1><p>さしすせそ</p>';
- echo stripTags( $str ) . "\n";
- // 結果は「あいうえおかきくけこさしすせそ」
- echo stripTags( $str, array('H1') ) . "\n";
- // 結果は「あいうえお<h1>かきくけこ</h1>さしすせそ」
- /**
- * stripTags() – 特定のタグとコメントを除いたタグの削除
- * @param str $str 対象のテキスト
- * @param ary $denys 削除しないタグ
- */
- function stripTags($str, $denys=array()){
- // タグとコメントの基本パターン
- $pt = '/(<\w+|<\/\w+|<\!\-\-)([^<>]*>)/iu';
- // 戻り値用
- $replaceStr = "";
- $num = count( preg_split($pt, $str) ) – 1;
- // パターンにマッチする回数分ループ
- for($i=0; $i<$num; $i++ ){
- // パターンにマッチする一つ目を取得
- preg_match($pt, $str, $match);
- foreach($denys as $tag){
- $denyPattern = '/(<\/?)(' . $tag . ')([^<>]*>)/iu';
- if( preg_match($denyPattern, $match[0]) ){
- // マッチした場合
- // 0文字目からマッチしたタグまで取得
- $replaceStr .= getStrFromSelectWordToZero($str, $match[0], 'keep');
- //マッチしたタグ以降を取得
- $str = getStrFromNumberToSelectWord($str, $match[0], 'del');
- // 1回処理したら以降の処理をせずにループを抜ける
- continue 2;
- }
- }
- // マッチしないものは削除
- $str = preg_replace($pt, '', $str, 1);
- }
- // 残ったものを合体
- $replaceStr .= $str;
- return $replaceStr;
- }
- /**
- * getStrFromSelectWordToZero() – 0文字目から指定したKWの直後までを取得。
- * @param str $mySTR 検索元の文字列
- * @param str $findKW 検索するキーワード
- * @param str $copeKW 指定したKWの対処:[del]で削除。[keep]で残す。
- */
- function getStrFromSelectWordToZero($mySTR, $findKW, $copeKW){
- // $findKWが最初に出現する位置を探す
- $pos = mb_strpos($mySTR, $findKW);
- if($pos === false){
- // 検索KWが存在しない場合は何もしない
- return $mySTR;
- }
- // 検索するキーワードの対処
- if( $copeKW == "del" ){
- #$pos += mb_strlen($findKW);
- }elseif( $copeKW == "keep"){
- $pos += mb_strlen($findKW);
- }
- // 指定した文字位置($pos)から$num文字を返す。
- return mb_substr($mySTR, 0, $pos);
- }
- /**
- * getStrFromNumberToSelectWord() – 指定したKWから$num文字取得する。
- * 指定したKWは文字数に含まれる。
- * @param str $mySTR 検索元の文字列
- * @param str $findKW 検索するキーワード
- * @param str $copeKW 指定したKWの対処:[del]で削除。[keep]で残す。
- * @param int $num 取得したい文字数:NULLで最後まで取得
- */
- function getStrFromNumberToSelectWord($mySTR, $findKW, $copeKW, $num=null){
- // $findKWが最初に出現する位置を探す
- $pos = mb_strpos($mySTR, $findKW);
- if($pos === false){
- // 検索KWが存在しない場合は何もしない
- return $mySTR;
- }
- // 検索するキーワードの対処
- if( $copeKW == "del" ){
- $pos += mb_strlen($findKW);
- }elseif( $copeKW == "keep"){
- }
- // 文字数の指定がない場合($num == NULL)、最後まで表示。
- if( $num == NULL ){
- $num = mb_strlen($mySTR) – $pos;
- }
- // 指定した文字位置($pos)から$num文字を返す。
- return mb_substr($mySTR, $pos, $num);
- }