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

PHP strip_tags 保留多個 HTML 標籤的完整用法

     編輯:PHP 綜合知識

函數簡介

strip_tags() 是 PHP 內建的字串處理函數,用於移除字串中的 HTML、XML 與 PHP 標籤。其語法如下:

string strip_tags ( string $str [, string $allowable_tags ] )

參數說明:

  • $str:必填,要處理的輸入字串。
  • $allowable_tags:選填,指定不被移除的標籤清單。

回傳值:處理後的字串。

基本使用範例

假設有一個包含多層標籤的字串:

$str = "<p>我來自<b><a href='https://www.example.com'>範例網站</a></b></p>";

1. 移除所有標籤

echo strip_tags($str); 
// 輸出:我來自範例網站

2. 保留單一標籤 (<a>)

echo strip_tags($str, "<a>"); 
// 輸出:我來自<a href='https://www.example.com'>範例網站</a>

3. 保留多個標籤 (<p>、<b>)

多個標籤以空白字元分隔:

echo strip_tags($str, "<p> <b>"); 
// 輸出:<p>我來自<b>範例網站</b></p>

注意:<a> 標籤的屬性(如 href)會被完整保留,但 <p>、<b> 等無屬性標籤僅保留標籤本身。

進階需求:移除特定標籤而非保留

strip_tags() 只能「白名單」模式(指定保留),若需「黑名單」模式(指定移除),需自行實作。以下為可移除指定標籤的自訂函數:

function strip_selected_tags($text, $tags = array()) {
    $args = func_get_args();
    $text = array_shift($args);
    $tags = (func_num_args() > 2) ? array_diff($args, array($text)) : (array) $tags;

    foreach ($tags as $tag) {
        // 移除成對標籤並保留內容
        if (preg_match_all('/<' . $tag . '[^>]*>([^<]*)</' . $tag . '>/iu', $text, $found)) {
            $text = str_replace($found[0], $found[1], $text);
        }
    }
    // 移除殘留的單獨標籤(如未閉合或帶屬性)
    return preg_replace('/(<(' . join('|', $tags) . ')( | |.)*>)/iu', '', $text);
}

// 使用範例
$str = "<b>粗體文字</b> <i>斜體</i>";
echo strip_selected_tags($str, array('b')); 
// 輸出:粗體文字 <i>斜體</i>

實務注意事項

  • XSS 風險:strip_tags() 不保證能防禦 XSS 攻擊。惡意使用者可能透過屬性注入腳本(如 <img src=x onerror=alert(1)>)。請搭配 htmlspecialchars() 或 HTML Purifier 等庫使用。
  • 標籤大小寫:函數對標籤名稱不區分大小寫,<A> 與 <a> 視為相同。
  • 巢狀結構:函數不解析 DOM 結構,僅做字串比對,複雜巢狀標籤可能產生非預期結果。
  • PHP 8.1+:支援 <dialog>、<slot> 等新標準標籤。

總結

strip_tags() 適合簡單的標籤過濾場景(如儲存純文本摘要)。需保留多標籤時,以空白分隔標籤名稱即可。若需精確移除特定標籤或防禦 XSS,建議使用 DOMDocument 解析或成熟的安全庫。

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