그 HTML 엔터티는 무엇입니까?


11

목표는 정말 간단합니다. 문자열을 입력으로 받으면 다음 문자 (대문자 변형 포함)에 해당하는 모든 HTML 엔티티를 구문 분석하십시오.

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

파싱 ​​규칙 :

  • 각 개체는 시작 &과 끝;
  • 뒤에 나오는 첫 번째 문자 &는 수정 된 문자입니다 (문자는 중요합니다!).
  • 나머지 문자는 사용하는 악센트의 이름을 참조 ( acute, grave, circ, tildeuml). 악센트 이름 소문자 여야합니다! *
  • 이 목록에없는 캐릭터를 생성하거나 그 무효 인 모든 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\x81또는에 해당 a\u0301)
  • HTML 엔터티를 사용하지 않는 분음 부호 조합

결과는 렌더링 / 표시 될 때 목록의 문자와 시각적으로 유사해야합니다.


모든 표준 허점 과 내장 *은 허용되지 않습니다 . 이것이 이므로 가장 짧은 답변이 이깁니다.

*이 변경은 보너스 및 위약금의 큰 비 승인으로 인해 작성되었으며 글을 쓸 때 답변을 무효화하지 않습니다.


4
나는 투표하지 않았지만, 사람들은 실제로 보너스 / 페널티를 좋아하지 않기 때문에 다운 보트가 있다고 가정합니다.
Kevin W.

1
@KevinW. 샌드 박스에서 설명했듯이 사람들이 얻을 수있는 멋진 내장 기능을보고 싶기 때문에 이러한 처벌 만 남았습니다. 그러나 분명히, 나는 모든 사람의 재미를 망치고 싶지 않습니다. 내가 참회를하지 않았다면, 내가 준 Javascript 예제와 같은 대답이면 충분합니다. 그리고 그것은 전혀 일이 필요하지 않았습니다.
Ismael Miguel

1
IMHO, 보너스는 임의적 인 것처럼 보입니다. 허용하거나 허용하지 않습니다.
애디슨 크럼

1
@IsmaelMiguel 나는 보너스 / 벌금을 제안하지 않는다-그들이 원하는 프로그래밍 방법을 허용하고 (물론 표준 허점 밖에서) 보너스 / 벌금을 제거하십시오.
애디슨

2
@IsmaelMiguel Nah-그것은 내 센트였습니다. c :
Addison Crump

답변:


4

apt, 81 75 바이트

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

6 ?은 인쇄 할 수없는 문자를 나타냅니다. 온라인으로 테스트하십시오!

참고 : 세 번째 인코딩 옵션이 출력됩니다. 즉, 문자 뒤에 해당 결합 분음 부호의 원시 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

코드의 16 진 덤프 :

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

잘 작동하는 것 같습니다. 16 진수 덤프를 제공해 주시겠습니까? 모든 인코딩에서 작동하지 않을 수있는 "이상한"문자가있는 것 같습니다.
Ismael Miguel

@IsmaelMiguel 저는 액센트가 ISO-8859-1 인코딩의 일부가 아니라는 것을 깨달았습니다. 따라서 문자열을 압축 해제하고 UTF-8 바이트로 전환했습니다. 아직도 hexdump를 원하십니까?
ETHproductions

당신에게 달려 있지만 이전 솔루션은 완벽하게 훌륭했습니다.
Ismael Miguel

난 당신이 거기에 작은 버그가있을 수 있습니다 생각, 코드를 떠날 것으로 보인다 Ý... 혼자하지만, y로 변경해야합니다
daavko

@daavko Whoops, 당신 말이 맞아요! 지금 수정했습니다.
ETHproductions

12

자바 스크립트 (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는 놀랍도록 짧습니다.

편집 : Neil은 정의되지 않은 나쁜 사례를 발견했습니다. 이제 수정되었습니다.


보다? 나는 당신이 지방을자를 수 있다고 말했습니다! 이것은 정말 놀라운 답변입니다! 나는 속에서의 싸움은 정말 당신이 더 많은 + 1 개의를 얻을 희망
이스마엘 미구엘

1
이것은 영리합니다. +1
Yytsi

나는 그것을 좋아한다 ..! String.prototype.replace끈 통과를 위해 엄청나게 골프를 칠 수 있습니다.
Archenoth

나는 이것이 옳은 일을한다는 것을 확신하지 못한다 É.
Neil

슬프게도 @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을 사용합니다.

[letter] \ xCC \ x [diacritical mark hex code] 접근 방식을 사용합니다. 분 음표는 모든 관련 문자 뒤에 추가됩니다.

어떤 이유로 인터프리터의 기본 Droid Sans Mono 글꼴은 "circ"및 "uml"문자를 올바르게 렌더링 할 수 없습니다. 개발자 도구를 통해 DejaVu Sans와 같은 것으로 변경하면 잘 표시됩니다. 나는 이것이 프로그램이 아니라 글꼴의 한계라고 생각합니다. 그러나 그것이 프로그램의 결함이라면 그것을 고치려고 노력할 것입니다.

여기서 대체하지 않는 129 바이트 버전이며, 대문자 entites HTML (예를 들어 Á)

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

온라인으로 사용해보십시오!
온라인으로 사용해보십시오! 129 바이트 버전


거기에 마크를 많이 사용합니다. 처음에는 더 짧을 것이라고 생각하지 못함> _ <
Mwr247

감사합니다! 나는 그것을하고 싶었고 마크가 어딘가에 나타났기 때문에 이것을하는 방법을 찾고있었습니다 ... 정말로 너무 짧아서 놀랐습니다.
daavko

1
멋진 페어 플레이와 규칙 사용! 나는이 언어를 좋아하지 않았지만이 답변을 정말 좋아합니다. 인스턴트 +1
Ismael Miguel

나는 115 바이트 (110 문자 + 5 여분의 바이트 표시)를 세었다.
Mwr247

@ Mwr247 아, 맞아. 방금 텍스트 문서에 붙여 넣고 ls -l을 실행했으며 116을 보여주었습니다. 편집자가 끝에 새 줄을 추가 한 것으로 보입니다. 내가 고칠 게
daavko

3

자바 스크립트 (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)을 사용하여 엔티티를 변환해야하는지 여부와 문자 코드가 무엇인지 확인합니다. 이 경우 대칭은 &Yuml;UTF8에 대해 다른 오프셋을 사용하는 경우를 제외하고 소문자 인 경우 32를 더하는 것을 의미 합니다.


좋은! 나는 당신의 aproach를 정말로 좋아하지만 286 바이트는 약간 길다. 어쩌면 잘릴 수있는 몇 가지가 있습니까? 지방
Ismael Miguel

@IsmaelMiguel 288 실제로; 나는 실제로 &Yuml;UTF8에 a가 있다는 것을 깨달았습니다 : 그것은 이상한 장소에 있습니다. 마찬가지로 리터럴 교체 목록이 두 배 이상 길다는 점을 고려하여 압축 및 최적화를 생각했습니다. 내가 아닌 것을보고 있습니까?
Mwr247

실제로는 아닙니다 .toLowerCase().를 사용하는 것보다 소문자를 만드는 더 좋은 방법이 있어야합니다 . 그 이름은 거대합니다 !!! 또한 String.fromCharCode여러 매개 변수를 사용하거나 다음과 같이 호출 할 수 있습니다.String.fromCharCode.call([...])
Ismael Miguel

1
@IsmaelMiguel 나는 다시 작성해야한다는 것이 옳았지만 다른 사람이 필요하다는 것은 잘못된 것 같습니다. 이 답변이 더 재미 있다고 생각하지만 다른 답변은 기술적으로 더 간결합니다. 따라서 둘 다 별도로 포함 시켰습니다.
Mwr247

1
인생을 바꾸지는 않지만 정규 표현식에는 리터럴 문자가 없으므로 i플래그 가 필요하지 않습니다 .
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.