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

PHP 關鍵詞高亮:給指定詞彙添加 Span 標籤實現

     編輯:PHP 綜合知識

需求

在代碼片段或文本中,將預定義關鍵詞(如 PHP 保留字)包裹 <span class="kw"> 實現高亮,要求全詞匹配、不破壞 HTML 結構、忽略註釋內關鍵詞。

核心實現

<?php
function codeWords($code) {
    $keywords = [
        'as','break','case','class','continue','default','do','elif','else','elseif',
        'for','foreach','function','if','new','null','return','self','switch',
        'this','to','typeof','until','var','void','while','with'
    ];

    // 1. 構造全詞匹配正則:排除 // 註釋後的內容
    // (?://.*)? 匹配可選的行內註釋,\K 重置匹配起點(PHP 5.2.4+)
    // 兼容舊版本用捕獲組替代 \K
    array_walk($keywords, function(&$v) {
        $v = "/^((?:(?!\\/\\/).)*)\\b$v\\b/";
    });

    // 2. 構造替換模板
    $replacements = array_map(function($kw) {
        return "$1$kw";
    }, $keywords);

    // 3. 執行替換
    return preg_replace($keywords, $replacements, $code);
}

// 使用
$source = '';

echo codeWords($source);
?>

關鍵正則解析

模式含義
^((?:(?!//).)*)行首開始,匹配任意非 // 開頭的字符(負向前瞻),捕獲到組 1
\b單詞邊界,確保全詞匹配(不匹配 className 中的 class)
$kw關鍵詞本身
\b結束邊界
替換 $1$kw保留註釋前內容(組1),關鍵詞包裹 span

進階:支援多語言、多樣式、HTML 安全

function highlightKeywords($text, array $keywords, $tag='span', $class='keyword', $encoding='UTF-8') {
    // 1. 轉義關鍵詞用於正則
    $escaped = array_map(function($kw) { return preg_quote($kw, '/'); }, $keywords);
    // 2. 構造大正則:單詞邊界 + 非註釋區域(簡化版,實際需語言感知解析器)
    $pattern = '/\b(' . implode('|', $escaped) . ')\b/';
    // 3. 替換
    return preg_replace_callback($pattern, function($m) use ($tag, $class) {
        return "<$tag class=\"$class\">{$m[0]}";
    }, $text);
}

// 使用
$phpKeywords = ['if','else','while','for','function','class','public','private','protected'];
echo highlightKeywords($code, $phpKeywords, 'span', 'kw-php');

注意事項

  • 純正則無法完美處理嵌套結構(字符串字面量、註釋、Heredoc),生產環境建議用 PHP-Parser 或 Highlight.js/Prism.js 前端高亮
  • 大文本 preg_replace 可能觸發 pcre.backtrack_limit,需分塊處理
  • 輸出入 HTML 時確保關鍵詞已 htmlspecialchars,防 XSS
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved