该HTML实体是什么字符?


11

目标真的很简单。接收字符串作为输入,解析与以下字符(包括它们的大写变体)相对应的所有HTML实体:

áàãâäéèêëíìîïóòõôöúùûüýÿ

解析规则:

  • 每个实体都以开头&和结尾;
  • 之后的第一个字符&将是修改后的字符(大写字母很重要!)
  • 其余字符是指口音的名字就使用(acutegravecirctildeuml)。重音名称必须为小写!*
  • 产生一个字符,则不在此列,或者是无效的任何HTML实体,应保持不变(如:&&etilde;&a;
  • 数字实体应被忽略,因为它们不符合上述规则

此更改自2016年2月18日开始引入。接受带有大写重音符号的HTML实体的所有现有答案均有效。以后的任何回答都必须遵循此规则。

例子:

á //á
Téhèh //Téhèh
an & //an &

输出:

输出可以是ISO-8859- X(1-15),windows-1252或UTF-8 / 16/32。
您只能选择一种有效的编码,并将其用于任何输出。您可以放心地假设输入将为ASCII。

以下任何一项是的有效输出á

  • á(ISO-8859-1 / 15或Windows-1252,等效于\xE1
  • á(UTF-8,等效于\xC3\xA1\u00E1
  • (UTF-8,等效于a\xCC\x81a\u0301
  • 不使用HTML实体的变音符号的任意组合。

呈现/显示时,输出必须在视觉上类似于列表中的字符。


请记住,所有标准漏洞和内置 *都是不允许的。由于这是,因此最短的答案将获胜。

*做出此更改是由于奖金和罚款的严重不当,并且在撰写本文时不会使任何答案无效


4
我没有投票,但我认为不赞成投票的原因是人们并不真正喜欢奖金/罚金-他们最终将一项挑战变成了几次迷你挑战。
凯文·

1
@KevinW。正如我在沙盒中解释的那样,我之所以只留下那些惩罚,是因为我想看看人们能想到什么很酷的内置东西。但是显然,我不想破坏每个人的乐趣。如果我不加惩罚,那么像我给出的Javascript示例那样的答案就足够了。这根本不需要任何工作。
Ismael Miguel

1
恕我直言,奖金似乎是任意的-允许或不允许,不要介于两者之间。
Addison Crump

1
@IsmaelMiguel我建议不要使用奖金/罚金-允许使用他们希望使用的任何编程方法(当然,在标准漏洞之外)并删除奖金/罚金。
Addison Crump

2
@IsmaelMiguel Nah-那是我的全部钱。c:
Addison Crump

Answers:


4

Japt,81 75字节

Ur`&([%vYy](ac©e|uml)|%v(g?ve|circ)|[AaOo]Èìe);`@Yg +'Ì+"?????"g"gutca"bYgJ

六个?s代表不可打印的字符。在线测试!

注意:这将输出第三个编码选项。也就是说,字母后面是对应的组合变音标记的原始UTF-8编码。

这个怎么运作

Ur"&(    );"       // Replace each ampersand and semicolon that have one of these between them:
([%vYy](acute|uml) //  A vowel or Yy followed by "acute" or "uml",
|%v(grave|circ)    //  or a vowel followed by "grave" or "circ",
|[AaOo]tilde       //  or "a" or "o" followed by "tilde";
@                  // replace each match X and its middle Y with this function:
""g"gutca"bYgJ     //  Take the unprintable at index (index of the second char in Y in "gutca") in this string.
Yg +'Ì+            //  Concatenate the first char in Y and "Ì" to the beginning.
                   // Implicit output

代码的十六进制转储:

00000000: 55 72 60 26 28 5b 25 76 59 79 5d 28 61 63 a9 65  Ur`&([%vYy](ac©e
00000010: 7c 75 6d 6c 29 7c 25 76 28 67 9f 76 65 7c 63 69  |uml)|%v(g.ve|ci
00000020: 72 63 29 7c 5b 41 61 4f 6f 5d c8 ec 65 29 3b 60  rc)|[AaOo]Èìe);`
00000030: 40 59 67 20 2b 27 cc 2b 22 80 81 82 83 88 22 67  @Yg +'Ì+"....."g
00000040: 22 67 75 74 63 61 22 62 59 67 4a                 "gutca"bYgJ

看来效果很好。你能提供一个十六进制转储吗?您似乎有些“怪异”字符可能无法在每种编码中使用。
Ismael Miguel

@IsmaelMiguel我刚刚意识到这些重音不属于ISO-8859-1编码的一部分;因此,我解压缩了字符串并切换为UTF-8字节。您还想要六角转储吗?
ETHproductions 2016年

取决于您,但是您以前的解决方案完全可以。
Ismael Miguel

我认为您可能在这里有一个小错误,您的代码似乎没有问题Ý,但应该更改为Ý...
daavko

@daavko糟糕,您是对的!立即修复。
ETHproductions 2016年

12

的JavaScript(ES6),141个 122 134字节

a=>a.replace(/&([aeiouyAEIOUY](acute|uml)|[aeiouAEIOU](grave|circ)|[aoAO]tilde);/g,b=>b[1]+{g:"̀",a:"́",c:"̂",t:"̃",u:"̈"}[b[2]])

遵循daavko的使用变音标记的示例,我觉得自己是个白痴,没有考虑过早使用它。实际上,JavaScript简直令人惊讶。

编辑:尼尔捕获了一些未定义的坏情况,现在已修复。


看到?我告诉过你可以减掉一些脂肪!这真是一个令人惊讶的答案!我非常希望您获得更多的+1
Ismael Miguel

1
这真是聪明。+1
Yytsi '16

我喜欢它..!String.prototype.replace如此可笑地打高尔夫球以进行弦乐遍历。
Archenoth '16

我不相信这对É(不管正确的事情)做什么是正确的。
尼尔

可悲的是,@ Neil是正确的。浏览器认为大写HTML实体无效。但是,我没有指定重音名称应全部小写。那完全是我的错。我将认为此答案有效,并且已经发布的所有答案都将有效。但是任何新答案都必须使用小写的重音名称。
Ismael Miguel

10

视网膜,115字节

我是代码高尔夫球的新手,但我认为这可能有用。
此版本是在规则之前创建的,该规则不允许Á引入大写html实体(例如)。

i`&([aeiouy])acute;
$1́
i`&([aeiou])grave;
$1̀
i`&([ao])tilde;
$1̃
i`&([aeiou])circ;
$1̂
i`&([aeiouy])uml;
$1̈

非常简单的搜索和替换。使用UTF-8。

使用[字母] \ xCC \ x [变音符号十六进制代码]方法。在每个相关字母后添加变音标记。

由于某些原因,解释器中的默认Droid Sans Mono字体无法正确呈现“ circ”和“ uml”字母。如果通过开发人员工具将其更改为DejaVu Sans之类的内容,则显示效果很好。我认为这是字体的限制,而不是程序的限制。但是,如果这是程序的错误,我将尝试修复它。

这是129字节的版本,它不能替代大写的HTML实体(例如Á

&([aeiouyAEIOUY])acute;
$1́
&([aeiouAEIOU])grave;
$1̀
&([aoAO])tilde;
$1̃
&([aeiouAEIOU])circ;
$1̂
&([aeiouyAEIOUY])uml;
$1̈

在线尝试!
在线尝试!129字节版本


大量使用那里的标记。不敢相信我没有想到起初会更短> _ <
Mwr247 '16

@ Mwr247谢谢!我一直在寻找一种方法来做,因为我想尝试做,而且标记只是出现在某个地方...老实说,我很惊讶它这么短。
daavko '16

1
公平竞赛,遵守规则!我从不喜欢这种语言,但是我真的很喜欢这个答案。即时+1
Ismael Miguel

我计算了115个字节(110个字符+ 5个额外的标记字节)。
Mwr247 '16

@ Mwr247哦,对了。我只是将其粘贴到文本文档中并运行ls -l,它显示116 ...似乎编辑器在末尾添加了额外的换行符。我会解决的。
daavko '16

3

JavaScript(ES6),288个字节

a=>(z=(b,c=1,d=2,e=3,f=0,g=4)=>({b:b+191,grave:c,acute:d,circ:e,tilde:f,uml:g}),y={a:z(0,1,2,3,4,5),e:z(8),i:z(12),o:z(18,1,2,3,4,5),u:z(25),y:z(28,0,2,0)},a.replace(/&\w+;/gi,b=>(x=y[b[1].toLowerCase()])&&(w=x[b.slice(2,-1)])?String.fromCharCode(x.b+w+32*(b[1]>'_')+153*/Yu/.test(b)):b))

创建一个字符映射对象(每个字符都有基本数字代码),并使用偏移量(如果不存在则为0)确定是否应该转换实体及其字符代码是什么。情况下的对称性意味着如果为小写,则加32(除之外)&Yuml;,其中对UTF8使用不同的偏移量。


真好!我真的很喜欢您的方法,但是286个字节有点长。也许有些事情可以切断?修剪一些油脂会很棒
Ismael Miguel

@IsmaelMiguel 288; 我刚刚意识到,实际上&Yuml;UTF8 中有一个:它只是在一个怪异的地方。尽管如此,考虑到文字替换列表的长度是原来的两倍,所以我认为我对它进行了精简和优化。你看到我不是的东西吗?
Mwr247 '16

并非如此...肯定有比使用小写字母更好的方法.toLowerCase()。那名字叫巨大!!!此外,String.fromCharCode可以接受多个参数,或称为String.fromCharCode.call([...])
Ismael Miguel

1
@IsmaelMiguel似乎我对它需要重写是对的,但对它需要成为别人却是错误的。我觉得这个答案更有趣,但是另一个在技术上更加简洁,因此我将它们分别包含在内。
Mwr247 '16

1
不会改变生活,但是您的regexp不包含文字字母,因此不需要该i标志。
尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.