首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP fgetss() 函數缺陷分析與自製過濾 HTML 標籤函數 mygets()

     編輯:PHP 相關知識

問題背景

PHP 4.x 內建 fgetss() 無法完整過濾 HTML 標籤,尤其在標籤跨行或包含特殊字元時失效。作者分析缺陷並提供替代函數 mygets()。

缺陷測試碼

<?php
$fp = fopen("index.html", "r");
while (!feof($fp)) {
    $ms = fgetss($fp);
    printf($ms);
}
fclose($fp);
?>

自製函數 mygets() 完整原始碼

<?php
function mygets($myFile) {
    $myline = fgets($myFile, 255);

    $big = strlen(strstr($myline, ">"));
    $small = strlen(strstr($myline, "<"));
    if ($big > $small) { // 處理標籤中間換行情況
        $myline = strstr($myline, ">");
        $myline = substr($myline, 1);
    }

    $len = strlen($myline);
    $startskip = false;
    $outstring = "";

    for ($i = 1; $i <= $len; $i++) {
        $a = substr($myline, $i-1, 1);
        switch ($a) {
            case "<": $startskip = true; break;
            case ">": $startskip = false; break;
            default: break;
        }
        if (!$startskip && $a != ">") $outstring .= $a;
    }

    $outstring = str_replace("&nbsp;", " ", $outstring);
    $outstring = str_replace(" ", "", $outstring); // 半形空格
    $outstring = str_replace(" ", "", $outstring); // 全形空格
    return $outstring;
}
?>

原理說明

  • 逐字元掃描,遇到 < 進入跳過模式,遇到 > 結束跳過。
  • 先處理行首可能出現的 >(跨行標籤情況)。
  • 移除 &nbsp;、半形/全形空白。
  • 可擴充處理其他 HTML 實體。

授權

免費使用,歡迎改進。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved