如何让维基乌尔都语纠错工具忽略双括号/大括号内的文本?
乌尔都语维基百科文本纠错工具修复方案
问题
开发乌尔都语维基百科文本纠错工具时,遇到核心问题:纠错逻辑会无差别替换所有位置的错误词汇,包括维基链接([[...]])和模板({{...}})内部的内容,导致链接/模板损坏。现有代码仅能跳过[[JavaScript]]这类简单链接,无法处理包含错误词汇的完整链接(如[[source codes of JavaScript software]])或模板,需要实现完全忽略[[...]]和{{...}}块内所有文本的逻辑。
解决方案
核心思路是先将所有维基链接和模板块临时替换为唯一占位符,待外部文本纠错完成后,再将占位符还原为原始内容。这样就能彻底避免修改块内的任何内容。
具体步骤
- 提取原文中所有
[[...]]和{{...}}的内容,存储到数组中 - 用带索引的占位符替换原文中的对应块
- 对替换后的纯文本执行纠错替换操作
- 将占位符还原为原始的链接/模板内容
修改后的完整代码
async function imla(imlaWords) { try { const pageTitle = mw.config.get('wgTitle'); let pageContent = await loadPage(pageTitle); const originalContent = pageContent; // 存储提取出的链接和模板内容 const placeholders = []; // 匹配所有[[...]]和{{...}},支持嵌套场景(维基语法中嵌套较少,无嵌套可简化为/\[\[.*?\]\]|\{\{.*?\}\}/g) const wikiBlocksRegex = /(\[\[(?:[^[\]]|(?R))*\]\]|\{\{(?:[^{}]|(?R))*\}\})/g; // 第一步:替换所有链接/模板为占位符 pageContent = pageContent.replace(wikiBlocksRegex, (match) => { const index = placeholders.length; placeholders.push(match); return `__PLACEHOLDER_${index}__`; }); // 第二步:对非块内文本执行纠错替换 imlaWords.forEach(([incorrectWord, correctWord]) => { const regex = new RegExp(incorrectWord, 'g'); pageContent = pageContent.replace(regex, correctWord); }); // 第三步:将占位符还原为原始链接/模板内容 pageContent = pageContent.replace(/__PLACEHOLDER_(\d+)__/g, (_, index) => { return placeholders[index]; }); const imlaCorrected = originalContent !== pageContent; if (imlaCorrected) { await savePage(pageTitle, pageContent); openDiffPage(pageTitle); } else { mw.notify('اِس صفحہ میں اصلاح کی ضرورت محسوس نہیں ہوئی۔'); } } catch (error) { mw.notify(error.message); } }
关键说明
wikiBlocksRegex:递归正则可匹配嵌套的链接/模板,若确认维基语法中无嵌套场景,可简化正则提升性能- 占位符使用唯一索引,确保还原时不会出现内容混淆
- 纠错逻辑仅作用于替换占位符后的纯文本,完全避开链接/模板块
内容的提问来源于stack exchange,提问作者Yethrosh
相关产品推荐
相关产品推荐

