小凡 发表于 2011-11-2 16:48:23

这个函数看不明白 求解释??

本帖最后由 小凡 于 2011-11-2 16:49 编辑

public static function fix_html($string)
    {
      //关闭自闭合标签
      $startPos = strrpos($string, "<");

      if (false == $startPos)
      {
            return $string;
      }

      $trimString = substr($string, $startPos);

      if (false === strpos($trimString, ">"))
      {
            $string = substr($string, 0, $startPos);
      }

      //非自闭合html标签列表   这个下面的过程 看不明白
      preg_match_all("/<(+)\s*([^>]*)>/is", $string, $startTags);
      preg_match_all("/<\/(+)>/is", $string, $closeTags);

      if (!empty($startTags) && is_array($startTags))
      {
            krsort($startTags);
            $closeTagsIsArray = is_array($closeTags);
            foreach ($startTags as $key => $tag)
            {
                $attrLength = strlen($startTags[$key]);
                if ($attrLength > 0 && "/" == trim($startTags[$key][$attrLength - 1]))
                {
                  continue;
                }
                if (!empty($closeTags) && $closeTagsIsArray)
                {
                  if (false !== ($index = array_search($tag, $closeTags)))
                  {
                        unset($closeTags[$index]);
                        continue;
                  }
                }
                $string .= "</{$tag}>";
            }
      }

      return preg_replace("/\<br\s*\/\>\s*\<\/p\>/is", '</p>', $string);
               
    }

qi_ruo 发表于 2011-11-2 21:35:32

本帖最后由 qi_ruo 于 2011-11-2 22:23 编辑

$str = 'aaaa<div>bbbb<p>cccc<a href="#" alt="dddd">eeee<img src="pic.jpg">ffff</a>gggg<br /><br /></p>hhhh</divuuuu';
function fix_html($string)
{
    //关闭自闭合标签
    $startPos = strrpos($string, "<"); //查找最后一个 < 的位置

    if (false == $startPos)
    {
      return $string; //如果字符串中没有 < 便签 直接返回 不再检查
    }

    $trimString = substr($string, $startPos);// 从最后一个 < 到字符串结尾

    if (false === strpos($trimString, ">"))
    {
      $string = substr($string, 0, $startPos);//如果之间没有 > 便签 那这一段就不要了
    }

    //非自闭合html标签列表
    preg_match_all("/<(+)\s*([^>]*)>/is", $string, $startTags);
    //第一个括号匹配标签名 第二个括号匹配属性
    //$startTags 将存放所有起始标签的名字, 比如
    //$startTags 将存放所有起始标签的属性, 比如 ['', '', 'href="#"', 'src="pic.jpg" / ', '/']

    preg_match_all("/<\/(+)>/is", $string, $closeTags);
    //$closeTags 将存放所有结束标签的名字 比如

    if (!empty($startTags) && is_array($startTags))// 如果$startTags为空的话 说明没有找到起始标签
    {
      krsort($startTags); // 把$startTags倒序排列 以便和结束标签对应处理 可以想象成一种栈的结构
      $closeTagsIsArray = is_array($closeTags);
      foreach ($startTags as $key => $tag)
      {
            $attrLength = strlen($startTags[$key]);//该起始标签属性的长度
            if ($attrLength > 0 && "/" == trim($startTags[$key][$attrLength - 1])) // 要么属性的最后一个字符是 /
            {
                continue;// 如果属性的最后一个字符为 / 比如<img />继续
            }
            if (!empty($closeTags) && $closeTagsIsArray) // 要么有结束标签
            {
                if (false !== ($index = array_search($tag, $closeTags)))// 能找到对应的结束标签
                {
                  unset($closeTags[$index]); // 从结束标签列表中去除
                  continue;
                }
            }
            $string .= "</{$tag}>";// 到此说明没有结束标签 加上结束标签
      }
    }

    return preg_replace("/\<br\s*\/\>\s*\<\/p\>/is", '</p>', $string); // 如果 </p> 之前有<br /> 删除之, 但只删一个
}


但也有些问题
比如 如果img 标签 写成了 <img src="#">程序会修正为 <img src="#"></img> 而不是 <img src="#" />
该函数的功能只是负责标签合闭,也可以进一步完善,
可以参考http://www.barattalo.it/html-fixer/

乔布斯 发表于 2011-11-2 22:21:37

我也看不明白:Q

小凡 发表于 2011-11-3 14:22:35

qi_ruo 发表于 2011-11-2 21:35 static/image/common/back.gif
但也有些问题
比如 如果img 标签 写成了   程序会修正为而不是
该函数的功能只是负责标签合闭,也可以 ...

3Q谢谢啦
页: [1]
查看完整版本: 这个函数看不明白 求解释??