Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#,如何手动验证html标记?_C#_Html_Parsing_Validation - Fatal编程技术网

使用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