为何向字符串添加字符后,我的CMS检测代码无法正常工作?
解决CMS检测工具的匹配问题
问题根源
你代码里搜索的是带HTML实体的字符串<meta name="generator" ,但浏览器解析页面后,innerHTML中的HTML实体会被还原成实际字符(比如"变成",<变成<),所以用实体字符串去匹配自然找不到结果。另外,直接匹配HTML字符串还容易受标签格式影响——比如标签里的空格数量、属性顺序变化,都会导致匹配失败。
可靠的解决方案
别用字符串匹配HTML内容,直接用DOM API查询对应的meta标签,这种方式不受格式干扰,结果更准确:
const detectCMS = (): string => { // 定位name为generator的meta标签 const generatorMeta = document.querySelector('meta[name="generator"]'); // 检查标签是否存在,且content包含WordPress标识 if (generatorMeta && generatorMeta.content.includes('WordPress')) { return 'WordPress'; } // 这里可以扩展其他CMS的检测逻辑,比如检测Joomla、Drupal的generator内容 return 'Unknown'; };
如果你坚持用字符串匹配(不推荐)
把搜索字符串改成浏览器解析后的实际字符,也就是去掉HTML实体:
const detectCMS = (): string => { if (document.documentElement.innerHTML.includes('<meta name="generator" ')) { return 'WordPress'; } return 'Unknown'; };
但这种方式依然存在风险,比如目标页面的meta标签可能写成<meta name='generator'(单引号)、或者属性之间有多个空格,都会导致匹配失败,所以优先推荐DOM API的方式。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

