Claude.AI 帮我改进 IsHtml 判断
让我重新分析这个问题:
- 需要考虑的HTML情况:
- 简单标签:
<div>text</div> - 带属性标签:
<a href="url">text</a> - 自闭合标签:
<br/> - 带属性的自闭合标签:
<img src="img.jpg"/>
- 需要排除的markdown链接格式:
- 专指
<https://...>这种格式 - 特征是 < 后紧跟 http 或 https
- 当前正则的问题:
<\s*([a-zA-Z]+)[^>]*>.*</\s*\1\s*>|<\s*([a-zA-Z]+)[^>]*/>
它会匹配所有以 < 开头,包含字母的内容,这就导致了误匹配
- 改进思路:
- 排除标签名以
http(s)开头的情况 - 使用负向预查
(?!http(s)?) - 放在标签名匹配的开始处
- 优化后的正则表达式:
<\s*(?!https?)([a-zA-Z]+)[^>]*>.*</\s*\1\s*>|<\s*(?!https?)([a-zA-Z]+)[^>]*/>
- 验证效果:
<div>text</div>✓ 匹配<a href="url">text</a>✓ 匹配<br/>✓ 匹配<img src="img.jpg"/>✓ 匹配<https://abc.com/>✗ 不匹配
这个解决方案:
- 保留了原有正则的基本结构
- 只添加了对标签名的限制条件
- 能正确处理各种HTML标签
- 成功排除markdown格式的URL
建议修改代码为:
public static bool IsHtml(this string input)
{
return Regex.IsMatch(input,
@"<\s*(?!https?)([a-zA-Z]+)[^>]*>.*</\s*\1\s*>|<\s*(?!https?)([a-zA-Z]+)[^>]*/>",
RegexOptions.Singleline | RegexOptions.IgnoreCase);
}