如何解析填字游戏HTML数据,开发Greasemonkey脚本实现正则自动填答?
搞定填字游戏脚本的答案分类解析与自动填充
嘿,我来帮你解决这个Greasemonkey脚本里的填字游戏答案分类解析问题!针对你提到的<div class="cross_q">里的Across/Down条目,咱们可以用DOM操作加正则表达式搞定提取,然后生成你需要的变量(或者更灵活的对象存储),再结合预定义答案列表做正则匹配填充。
第一步:解析Across/Down的答案条目
首先咱们先把目标区域的文本拿出来,然后用正则把每个题号和对应的答案拆出来。这里给你两种实现方式:一种是生成你想要的1a、3a这类单独变量,另一种是用对象存储(更推荐,后期维护更方便)。
// 先拿到填字游戏的题目区域文本 const crossQElement = document.querySelector('.cross_q'); if (!crossQElement) return; // 防止找不到元素报错 const crossQText = crossQElement.textContent.trim(); // 方式1:生成你要的单独变量(比如1a、3d) // 处理Across部分 const acrossSection = crossQText.match(/Across:\s*([\d\.\s\w]+?)(?=\s*Down:|$)/s); if (acrossSection) { const acrossItems = acrossSection[1].match(/(\d+)\.(\w+)/g); acrossItems.forEach(item => { const [num, answer] = item.split('.'); // 把变量挂载到window上,全局可访问 window[`${num}a`] = answer.toLowerCase(); }); } // 处理Down部分 const downSection = crossQText.match(/Down:\s*([\d\.\s\w]+?)(?=\s*$)/s); if (downSection) { const downItems = downSection[1].match(/(\d+)\.(\w+)/g); downItems.forEach(item => { const [num, answer] = item.split('.'); window[`${num}d`] = answer.toLowerCase(); }); } // 方式2:用对象存储(更推荐,方便批量处理) const crosswordAnswers = { across: {}, down: {} }; // 重复上面的匹配逻辑,把结果存到对象里 // 比如 crosswordAnswers.across['1'] = 'equipment'
第二步:正则匹配预定义答案并填充
有了解析好的答案变量/对象,接下来就可以对着你的预定义答案列表做正则搜索了。比如假设你的预定义答案是按分类存的,咱们可以这样匹配填充:
// 假设你的预定义答案列表长这样 const predefinedAnswers = { across: { '1': ['equipment', 'toolkit', 'gear'], '3': ['artifact', 'relic', 'ancient object'] }, down: { '2': ['stream', 'river', 'creek'] } }; // 举个例子:匹配Across第1题的答案 // 精确匹配 const exactMatch1a = predefinedAnswers.across['1'].find(ans => ans === window['1a']); // 模糊正则匹配(比如忽略大小写、支持部分匹配) const fuzzyMatch1a = predefinedAnswers.across['1'].find(ans => ans.match(new RegExp(`^${window['1a']}$`, 'i'))); // 找到对应的输入框填充(这里假设输入框有data-num和data-dir属性,你得根据实际页面调整选择器) if (exactMatch1a) { const targetInput = document.querySelector(`input[data-num="1"][data-dir="across"]`); if (targetInput) targetInput.value = exactMatch1a; }
小提示
- 如果页面里的题目文本格式有变化(比如带标点、空格),你得微调正则表达式,比如把
\w+改成[\w\s]+来匹配带空格的答案。 - 用对象存储答案比单独变量更方便,比如你要批量处理所有Across题目时,直接遍历
crosswordAnswers.across就行,不用一个个写变量名。 - 填充输入框时,一定要先确认页面里的输入框怎么定位,比如看它们的类名、ID或者父元素结构,选最稳定的选择器。
内容的提问来源于stack exchange,提问作者INeedTogepi




