How does HTML parse <font color=“testing”>?
关于HTML为什么认为"chucknorris"是一种颜色?
以下分析是否正确?
首先,所有非十六进制字符都替换为"
测试->
然后,如果它不能被3整除,则在它后面附加"0"。
然后分成三个相等的组。
然后得到每组的前2个字符,并将它们连接在一起,得到您的颜色代码。
但是,如果您使用此网站并输入字体颜色作为"测试",它将显示为红色阴影: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值,而不是十六进制颜色值。所以你不是在创建
更多的例子:
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