使用C#,如何手动验证html标记?
例如,我有一个图像标签:使用C#,如何手动验证html标记?,c#,html,parsing,validation,C#,Html,Parsing,Validation,例如,我有一个图像标签: <img src="http://... .jpg" al="myImage" hhh="aaa" /> 我正在解析img标记,并获得如下所示的已使用属性: L2=(src, al, hhh) <img src="http://... .jpg" alt="myImage" /> 如何通过编程验证图像标记?因此“al”属性应该变成“alt”(“alt”属性比“align”更像包含更多字符的属性),而“hhh”标记将消失(因为没有类似的属性)
<img src="http://... .jpg" al="myImage" hhh="aaa" />
我正在解析img标记,并获得如下所示的已使用属性:
L2=(src, al, hhh)
<img src="http://... .jpg" alt="myImage" />
如何通过编程验证图像标记?因此“al”属性应该变成“alt”(“alt”属性比“align”更像包含更多字符的属性),而“hhh”标记将消失(因为没有类似的属性)
对于结果,标记应如下所示:
L2=(src, al, hhh)
<img src="http://... .jpg" alt="myImage" />
谢谢
Jeff标签的解析是最难的部分,既然你已经完成了,你现在要做的就是循环遍历元素,对照一组有效的元素检查它们,如果它们无效,对照一组通常拼写错误的项目检查它们,并根据需要进行替换/删除 类似于:
String[] ValidItems = {"alt", "src", "width", "height", "align", "border", "hspace", "longdesc", "vpace"};
Dictionary<String, String> MispeltItems = { {"al", "alt" } };
for(int i = ImgTagAttributes-1; i >= 0; i--)
{
var element = ImgTagAttributes[i];
if(!ValidItems.Contains(element))
{
if(MispeltItems.ContainsKey(element))
{
ImgTagElements.Replace(element, MispeltItems[element].Value);
//Or use remove and insert.
}
else
{
ImgTagElements.RemoveAt(i);
}
}
}
String[]ValidItems={“alt”、“src”、“width”、“height”、“align”、“border”、“hspace”、“longdesc”、“vpace”};
字典错配项={{“al”,“alt”};
对于(int i=ImgTagAttributes-1;i>=0;i--)
{
var元素=ImgTagAttributes[i];
如果(!ValidItems.Contains(元素))
{
if(错投项目.容器(元素))
{
ImgTageElements.Replace(元素,MispeltItems[element].Value);
//或者使用“移除并插入”。
}
其他的
{
移除(i)项中的元素;
}
}
}
(这是在stack overflow中编写的,如果有任何错误,只需说,这只是为了让您获得一个基本想法)您可以使用Linq2Xml轻松解析代码:
XElement doc = XElement.Parse(...)
然后针对内存字典中的有效属性,使用最佳匹配算法更正错误属性
编辑:我编写并测试了这个简化的最佳匹配算法(对不起,它是VB):
(简化后,您应该创建一个更结构化的字典,其中包含标记和每个标记的可能属性)
上面的代码调用一个方法来确定源字符串与任何有效标记的百分比
Private Function checkMatch(ByVal tag As String, ByVal source As String) As Integer
If tag = source Then Return 100
Dim maxPercentage As Integer = 0
For index As Integer = 0 To tag.Length - 1
Dim tIndex As Integer = index
Dim sIndex As Integer = 0
Dim matchCounter As Integer = 0
While True
If tag(tIndex) = source(sIndex) Then
matchCounter += 1
End If
tIndex += 1
sIndex += 1
If tIndex + 1 > tag.Length OrElse sIndex + 1 > source.Length Then
Exit While
End If
End While
Dim percentage As Integer = CInt(matchCounter * 100 / Math.Max(tag.Length, source.Length))
If percentage > maxPercentage Then maxPercentage = percentage
Next
Return maxPercentage
End Function
上述方法在给定源字符串和标记的情况下,通过比较单个字符来查找最佳匹配百分比
给定“widt”作为输入,它会发现“width”是80%匹配值的最佳匹配。假设是XHTML,但我认为这个问题对于HTML来说也应该足够好。如果我有一个26000行的HTML文件?在html中使用所有不同的标记?你说过你有一个有效属性的列表,所以这可以通过字典来实现,其中第一个元素是标记,第二个是有效属性。由于模棱两可(例如,al可以是alt或align),如果没有拼错项目列表,就无法自动获取拼错项目。将它们转换成c#格式完全是另一回事,您对这一点说得还不够,所以我现在将忽略它;如果标记/属性名称不在有效标记列表中,请计算它们不同的字符数,即:“widt”与“width”不同,但匹配率为80%,因此您可以更正它。您能给我一个此算法的示例吗?谢谢。我已经用c#实现了你的算法,但是如果我用'scr'代替'src',它会给我33%的匹配度,如果我用'sr'代替'src',它会给我66%的匹配度。。。我认为最好的是66%的购买案例。我不明白为什么如果我在单词的中间省略了一个字符(或者把它放错了),结果不到50%…给SCR的33%是正确的:你只提供了1/3个正确字符,只有“S”。算法不会检查相同字符的排列,我认为这是正确的。应该感觉到左边的火柴吗?我不这么认为,它们是不相关的词,即使是一个或另一个的字谜。另外,我认为sr->src是正确的,一个单词是2/3正确的。不同的是,当你在源中省略一封信时说:我的ALGO顺序地比较字母,所以如果你有例如“中间”和“混音”,你可以从6个匹配的字母中得到5个,这是正确的。但是如果你遗漏了一个字母。。。。。。然后,对比就爆发了。使用“理智->说”,你得到6分之2,因为丢失的字母扰乱了一切。如果你想要一个更好的算法,你可以改变它,并试图迫使两个词的长度相同。ie:sanity->saity会在较短单词的不同位置添加一个字母:Xsaity、sXaity、saXity、saitXy、saityX。最佳匹配女巫萨克西蒂尤奥6分5分:)
Private Function checkMatch(ByVal tag As String, ByVal source As String) As Integer
If tag = source Then Return 100
Dim maxPercentage As Integer = 0
For index As Integer = 0 To tag.Length - 1
Dim tIndex As Integer = index
Dim sIndex As Integer = 0
Dim matchCounter As Integer = 0
While True
If tag(tIndex) = source(sIndex) Then
matchCounter += 1
End If
tIndex += 1
sIndex += 1
If tIndex + 1 > tag.Length OrElse sIndex + 1 > source.Length Then
Exit While
End If
End While
Dim percentage As Integer = CInt(matchCounter * 100 / Math.Max(tag.Length, source.Length))
If percentage > maxPercentage Then maxPercentage = percentage
Next
Return maxPercentage
End Function