程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 函數 strip_tags 的一個嚴重 bug

PHP 函數 strip_tags 的一個嚴重 bug

編輯:關於PHP編程

PHP 函數 strip_tags 提供了從字符串中去除 HTML 和 PHP 標記的功能,該函數嘗試返回給定的字符串 str 去除空字符、HTML 和 PHP 標記後的結果。

由於 strip_tags() 無法實際驗證 HTML,不完整或者破損標簽將導致更多的數據被刪除。

比如下述代碼:

<div>string</div>string<string<b>hello</b><div>string</div>

通過 strip_tags($str, ‘<div>’) 過濾,我們可能期望得到如下結果:

<div>string</div>string<stringhello<div>string</div>

而實際操作結果是這樣的:

<div>string</div>string

這一切都是因為加紅的那個左尖括號,查了 PHP 的文檔,有一個警告提示:

由於 strip_tags() 無法實際驗證 HTML,不完整或者破損標簽將導致更多的數據被刪除。

既然在執行過濾前無法驗證代碼正確性,遇到和標簽相關的字符 “<” 或 “>” 後面的代碼就全掛了!

2013.01.11 更新:
以下方法可以解決該問題,但可能在 HTML 數據過大時,存在一定的效率問題,慎用!

function fixtags ($text) {
$text = htmlspecialchars($text);
$text = preg_replace("/&quot;/", "&quot;\"", $text);
$tags = "/&lt;(!|)(\/|)(\w*)(\ |)(\w*)([\\\=]*)(?|(\")\"&quot;\"|)(?|(.*)?&quot;(\")|)([\ ]?)(\/|)&gt;/i";
$replacement = "<$1$2$3$4$5$6$7$8$9$10$11>";
$text = preg_replace($tags, $replacement, $text);
$text = preg_replace("/=\"\"/", "=", $text);
$text = preg_replace("/&quot;\"/", "\"", $text);
return $text;
}

使用方法:

strip_tags(fixtags($string), '<div>');

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved