关于java:HTML如何解析< font color =“testing”>?

How does HTML parse <font color=“testing”>?

本问题已经有最佳答案,请猛点这里访问。

关于HTML为什么认为"chucknorris"是一种颜色?

以下分析是否正确?

  • 首先,所有非十六进制字符都替换为"0"。

    测试->0e00000

  • 然后,如果它不能被3整除,则在它后面附加"0"。

    0e00000->0e0000000

  • 然后分成三个相等的组。

    0e0000000->0e0 000 000

  • 然后得到每组的前2个字符,并将它们连接在一起,得到您的颜色代码。

    0e0 000 000->0e0000

  • #0e0000接近黑色。

    但是,如果您使用此网站并输入字体颜色作为"测试",它将显示为红色阴影:http://www.w3schools.com/tags/tryit.asp?文件名=TryHTML_字体_颜色

    我有什么东西不见了吗?

    答案后附加:

    我正在编写一个Android应用程序,它需要我解析font color="to colour codes。我把我拼凑的算法放在这里,以备将来参考:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    public String getColourCode(String nonStandardColour) {
        String rtnVal ="#000000";

        // first replace all non-hex characters
        String converted = nonStandardColour.toLowerCase().replaceAll("[g-z]","0");

        System.out.println(nonStandardColour +" is now" + converted);
        System.out.println("Length:" + converted.length());

        if (converted.length() <= 3) {

            // append"0"s if length != 3
            while (converted.length() !=3) {
                converted = converted +"0";
            }

            System.out.println("Converted colour is now" + converted);

            // Length is 3, so split into 3 characters and prepend 0 to each
            String[] colourArray = new String[3];
            colourArray[0] ="0" + convertedOpNickColour.substring(0, 1);
            colourArray[1] ="0" + convertedOpNickColour.substring(1, 2);
            colourArray[2] ="0" + convertedOpNickColour.substring(2, 3);

            rtnVal ="#" + Integer.toHexString(Color.rgb(
                                Integer.parseInt(colourArray[0], 16),
                                Integer.parseInt(colourArray[1], 16),
                                Integer.parseInt(colourArray[2], 16)));
        }

        else { // converted.length() is >= 4

            System.out.println("Appending 0s until divisible by 3");

            while(converted.length() % 3 != 0) {
                converted = converted +"0";
            }

            System.out.println("Converted colour is now" + converted);

            // divide into 3 equal groups
            List<String> colourArray2 = new ArrayList<String>();
            int index = 0;              
            while (index<converted.length()) {
                colourArray2.add(converted.substring(
                    index, Math.min(index(converted.length()/3),converted.length())));
                index+=(converted.length()/3);
            }

            System.out.printf("The 3 groups are:");
            System.out.printf(colourArray2.get(0));
            System.out.printf(colourArray2.get(1));
            System.out.printf(colourArray2.get(2));

            // if the groups are e.g. 0f0 0f0 0f0
            if (rgbColour.get(0).length() >=3 ) {
                rtnVal = Integer.toHexString(Color.rgb(
                    Integer.parseInt(colourArray2.get(0).substring(0,2), 16),
                    Integer.parseInt(colourArray2.get(1).substring(0,2), 16),
                    Integer.parseInt(colourArray2.get(2).substring(0,2), 16)));

                // remove alpha
                System.out.println("rtnVal is #" + rtnVal.substring(2));
                return"#" + rtnVal.substring(2);
            }

            // groups are e.g. 0f 0f 0f
            else {
                rtnVal = Integer.toHexString(Color.rgb(
                Integer.parseInt(colourArray2.get(0), 16),
                Integer.parseInt(colourArray2.get(1), 16),
                Integer.parseInt(colourArray2.get(2), 16)));

                System.out.println("rtnVal is #" + rtnVal.substring(2));
                return"#" + rtnVal.substring(2);
            }
        }
        return rtnVal;
    }


    它实际做的是将其拆分为RGB值,而不是十六进制颜色值。所以你不是在创建#0e0000,而是在创建RGB(0e0, 000, 000)。因为我们知道000只是0的一部分,所以我们只需要看看0e0的一部分。从这里,如果超过2位,您需要将前导的0减为2位,然后截断到数字中的左两位,这样您就可以得到e0。当你把它从十六进制转换成十进制时,你最终得到了e0 = 224。这给你的是RGB(224, 0, 0),或者大部分是红色。

    更多的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    eesting   => ee00000   => ee0 000 000 => RGB(ee0, 000, 000) => RGB(ee, 00, 00) => RGB(238, 0, 0)
    eeeting   => eee0000   => eee 000 000 => RGB(eee, 000, 000) => RGB(ee, 00, 00) => RGB(238, 0, 0)
    eeeeing   => eeee000   => eee e00 000 => RGB(eee, e00, 000) => RGB(ee, e0, 00) => RGB(238, 224, 0)
    eefeefeef => eefeefeef => eef eef eef => RGB(eef, eef, eef) => RGB(ee, ee, ee) => RGB(238, 238, 238)
    teeteetee => 0ee0ee0ee => 0ee 0ee 0ee => RGB(0ee, 0ee, 0ee) => RGB(ee, ee, ee) => RGB(238, 238, 238)
    0f0f0f    => 0f0f0f    => 0f 0f 0f    => RGB(0f, 0f, 0f)    => RGB(0f, 0f, 0f) => RGB(15, 15, 15)
    tftftf    => 0f0f0f    => 0f 0f 0f    => RGB(0f, 0f, 0f)    => RGB(0f, 0f, 0f) => RGB(15, 15, 15)
    ttfttfttf => 00f00f00f => 00f 00f 00f => RGB(00f, 00f, 00f) => RGB(0f, 0f, 0f) => RGB(15, 15, 15)


    是的,你是对的,它使用下面的解析算法,步骤如下首先,删除所有哈希标记,然后用0替换任何非十六进制字符(0-9a-f)。

    Dixit变为D0000。

    对于长度1-2,右填充至3个字符(0)。

    例如:"0f"变为"0f0","f"变为"f00"。

    对于长度3,将每个数字作为红色、绿色或蓝色的值,并在该值前加上0。

    例如:"0f 0"变为rgb(0,f,0),变为rgb(00,0f,00)或000f 00。

    任何小于4位数的值都在此时完成。

    对于长度4和更长的字段,用0填充到下一个3的整数倍。此步骤对于较长的字段很重要。

    例如:"0f0f"变为"0f0f00"

    接下来,字符串被分成三个均匀的部分,分别表示从左到右的红色、绿色和蓝色。

    "0f0f00"的行为与预期一致,变为RGB(0f,0f,00)。此时将完成6个字符的任何字符串。

    要验证以上内容,请单击此处

    为了测试下一个示例的算法检查,您将得到相同的结果

    1
    2
    <body bgcolor="DIXIT">
    <body bgcolor="D00000">

    将执行以下步骤来分析dixit

  • 用0 s替换非十六进制值对于D000
  • 对于长度4和更长的字段,用0填充到下一个3的整数倍。此步骤对于较长的字段很重要。所以现在"D0000"将是"D0 00 00 00",格式为RGB。