html标记检测过滤补全..

明天来加注释..


//html标记检测过滤补全

   public function replenish ($str)
  {

       $str = preg_replace('/\n\t/', '', $str);

       //允许的标记

       $allow = array(
'single' => array('img', 'br', ' hr'),
'double' => array('a', 'p', 'div', 'ul', 'li', 'span', 'font', 'b', 'table', 'tr', 'td', 'strong', 'tbody', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7'),);

       preg_match_all('/<(\w+|\!\-\-)\s?/', $str, $match_start);
       //标记开始

       preg_match_all('/<\/(\w+|\!\-\-)\s?/', $str, $match_end);

       $tag_num_start = array_count_values($match_start[1]);

       $tag_num_end = array_count_values($match_end[1]);

       $tag_num = count($tag_num_start) > count($tag_num_end) ? $tag_num_start : $tag_num_end;

       foreach ($tag_num as $k => $v) {

           if (($tag_num_start[$k] != $tag_num_end[$k]) && in_array($k, $allow['double']))  {

               $i = 0;

               $send = max($tag_num_start[$k], $tag_num_end[$k]) - min($tag_num_start[$k], $tag_num_end[$k]);
               preg_match_all('/<'.$k.'.*?>(.*?)<\/'.$k.'>/', $str, $matched);

               if ($matched[1]){

                   foreach ($matched[1] as $v_) {

                       if (strpos($v_, $k) !== false) {

                           $tmp_ = preg_replace('/<'.$k.'(.*)?>/', '</'.$k.'><'.$k.'$1>',$v_);

                           $str = str_replace($v_, $tmp_,$str);

                           $i++;

                       }

                   }

               } else {

                   $str = preg_replace('/<\/?'.$k.'>/', '<'.$k.'></'.$k.'>', $str);

                   $i = $send;

               }

               while ($i < $send) {

                   if ($tag_num_start[$k] > $tag_num_end[$k]){

                       $str .= '</'.$k.'>';

                   }else {

                       $str = '<'.$k.'>'.$str;

                   }

                   $i++;

                }


            }


       }

       return $str;

   }

你可能感兴趣的:(html,html标记检测过滤补全)