标签云

微信群

扫码加入我们

WeChat QR Code

如何HTML解析

This question already has an answer here:

With reference to Why does HTML think “chucknorris” is a color?

Is the following analysis correct?

  1. First, all non-hex characters are replaced with '0'.

    testing -> 0e00000

  2. Then if it is not divisible by 3, append '0's to it.

    0e00000 -> 0e0000000

  3. Then split into 3 equal groups.

    0e0000000 -> 0e0 000 000

  4. Then get the first 2 characters of each group and concatenate them together to get your colour code.

    0e0 000 000 -> 0e0000

#0e0000 is close to black.

But if you use this site and input font colour as "testing", it is displayed as a shade of red: http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_font_color

Is there something I'm missing?

APPENDED AFTER ANSWERS:

I'm writing an Android app which needs me to parse font color = "" to colour codes. I'm putting the algorithm I cobbled together here for future reference:

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;
}


Ah got it. Thanks! :)

2018年05月23日00分07秒

Terence I made some updates to the answer to clarify a few other scenarios.

2018年05月23日00分07秒