如何从Blogger不可修改的textarea中提取指定JS代码片段?
提取Blogger中动态type属性的script标签内指定代码片段
针对你遇到的Blogger平台中textarea#tempJs里script标签type属性动态变化、导致split方法失效的问题,这里提供两种可行的提取方案:
方案1:DOM解析法(推荐)
利用浏览器原生HTML解析能力,把textarea内容转为DOM节点后遍历筛选,完全不受type属性变化影响:
// 获取目标textarea的内容 const tempJsContent = document.getElementById('tempJs').value; // 创建临时容器用于解析HTML const tempDiv = document.createElement('div'); tempDiv.innerHTML = tempJsContent; // 遍历所有script标签,筛选包含双关键词的内容 let targetCode = null; for (const script of tempDiv.querySelectorAll('script')) { const content = script.textContent; if (content.includes("window['__wavt']") && content.includes("_WidgetManager._RegisterWidget")) { targetCode = content; break; } } // 处理结果 if (targetCode) { console.log('提取到的目标代码:', targetCode); // 这里可添加后续逻辑,比如执行代码或保存 } else { console.log('未找到符合条件的代码片段'); }
这种方法兼容性和可靠性更强,能处理各种合法HTML结构,不用担心type属性的动态变化。
方案2:正则表达式匹配
如果偏好纯字符串处理,可使用模糊匹配type属性的正则直接捕获目标内容:
const tempJsContent = document.getElementById('tempJs').value; // 正则匹配任意type属性的script标签,捕获包含双关键词的内容 const regex = /<script[^>]*type=["']?[^"']*["']?[^>]*>([\s\S]*?window\['__wavt'\][\s\S]*?_WidgetManager\._RegisterWidget[\s\S]*?)<\/script>/i; const matchResult = tempJsContent.match(regex); if (matchResult) { const targetCode = matchResult[1]; console.log('提取到的目标代码:', targetCode); } else { console.log('未找到符合条件的代码片段'); }
正则说明:
<script[^>]*type=["']?[^"']*["']?[^>]*>:匹配任意type属性的script标签开头(支持带/不带引号的type值)([\s\S]*?window\['__wavt'\][\s\S]*?_WidgetManager\._RegisterWidget[\s\S]*?):捕获包含两个目标关键词的script内容,[\s\S]匹配所有字符(含换行),*?避免过度匹配多个script标签<\/script>:匹配script标签结尾
注意:如果script内容里包含</script>字符串(比如注释中),正则可能提前终止匹配,这种场景下DOM解析法更稳妥。
内容的提问来源于stack exchange,提问作者Pinku Kumar
相关产品推荐
相关产品推荐

