基於JavaScript的關鍵詞過濾示例

AnPant發表於2024-11-06
業務場景中,合作第三方的的各種AI內容稽核模型,完全達不到滿意的狀態,奇怪這麼簡單的一個東西,有這麼複雜嗎,自己動手來一個DEMO,給開發,僅供參考。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>關鍵詞過濾器</title>
</head>
<body>

<h2>關鍵詞過濾器</h2>

<textarea cols=60 rows=10 id="userInput" placeholder="請輸入內容..."></textarea><br>
<button onclick="filterKeywords()">提交</button>

<h3>過濾後的內容:</h3>
<textarea cols=60 rows=10 id="filteredOutput" readonly></textarea>

<h3>關鍵詞(用逗號分隔):</h3>
<textarea cols=60 rows=10 id="keywordsInput">http,https,qq,wechat,weixin,.net,.org,.cn,fuck,.com,what app</textarea>

<script>
    // 提交時獲取關鍵詞並進行過濾
    function filterKeywords() {
        const content = document.getElementById("userInput").value;
        const keywords = getKeywords(); // 獲取當前輸入的關鍵詞列表
        const filteredContent = filterContent(content, keywords);
        document.getElementById("filteredOutput").value = filteredContent;
    }

    // 獲取關鍵詞並生成陣列
    function getKeywords() {
        const input = document.getElementById("keywordsInput").value;
        return input.split(",").map(keyword => keyword.trim().toLowerCase()).filter(Boolean);
    }

    // 過濾內容中的關鍵詞及前10個字元和後30個字元
    function filterContent(content, keywords) {
        let result = content;
        // 構建適用於一般關鍵詞和特殊關鍵詞的正則
        const generalKeywords = keywords.filter(k => !k.includes('.')).join("|"); // 一般關鍵詞
        const specialKeywords = keywords.filter(k => k.includes('.')).join("|"); // 特殊關鍵詞
        
        // 針對一般關鍵詞使用單詞邊界匹配
        const generalRegex = new RegExp(`(${generalKeywords})`, "gi");
        // 針對特殊關鍵詞,不使用單詞邊界
        const specialRegex = new RegExp(`(${specialKeywords})`, "gi");

        // 替換一般關鍵詞及其前10個字元和後30字元
        result = replaceKeywords(result, generalRegex);
        // 替換特殊關鍵詞及其前10個字元和後30字元
        result = replaceKeywords(result, specialRegex);

        return result;
    }

    // 替換內容中匹配的關鍵詞及其前10個字元和後30個字元
    function replaceKeywords(content, regex) {
        let result = content;
        let match;
        while ((match = regex.exec(content)) !== null) {
            const start = match.index;
            const end = Math.min(content.length, start + match[0].length + 30);  // 後30個字元
            const startReplace = Math.max(0, start - 10);  // 前10個字元
            const replaceStr = '*'.repeat(end - startReplace);  // 計算總替換長度

            result = result.slice(0, startReplace) + replaceStr + result.slice(end);
            regex.lastIndex = startReplace + replaceStr.length; // 更新正則搜尋起點,避免無限迴圈
        }
        return result;
    }
</script>

</body>
</html>

相關文章