challenge 改行をBRタグに置き換える

一部のHTMLタグを通すフィルタ どう書く?の続編です。 前回の条件を満たしつつ、入力中の改行を<br/>に置き換えてください。ただし、たとえば"<a\nhref=...>"といったようにタグの中に改行がある場合、単純に置換するわけには行かないことに注意してください。

また、ユーザの入力注の<br>は<br/>に変換してください。

このお題はperezvonさんの提案を元にした三部作の二問目です。ご協力ありがとうございました。

Posted feedbacks - JavaScript

前回のreplaceをwhileループに変更し、マッチしなかった箇所に対しても置換処理をする。
 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
var input = "<a title=\"(>_<;)\" href='www.google.com' name='hoge'\n\
>link</a> <blink>and</blink>\n <strong onClick='alert(\"NG\")'>click<br>me!</strong>";

function deleteAttr(attr) {
  return attr.replace(/\s+(\w+)\s*=\s*(["'])((?:[\r\n]|.)*?)\2/g,
    function(all, name, q, value) {
      return name.match(/name|href/i) ? all : '';
    });
}
function escapeHtml(h) {
  return h.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\r?\n/g, '<br/>');
}
function escapeTag(all, fslash, tag, attrs, q, rslash) {
  switch(tag.toUpperCase()) {
    case 'STRONG' :  // drop through
    case 'BR' : attrs = ''; rslash = '/'; break;
    case 'A' : attrs = deleteAttr(attrs); break;
    default : return escapeHtml(all);
  }
  return '<' + fslash + tag + attrs + rslash + '>';
}
function filter(html) {
  var reg = /<(\/?)(\w+)((?:\s+\w+\s*=\s*(["'])(?:[\r\n]|.)*?\4)*)?(\/?)>/gmi;
  var output = [], m, i=0;
  while(m = reg.exec(html)) {
    output.push(escapeHtml(html.substring(i, m.index)));
    output.push(escapeTag.apply(null, m));
    i= m.index + m[0].length;
  }
  output.push(escapeHtml(html.substring(i, html.length)));
  return output.join('');
}
document.body.innerHTML=filter(input);

 ややこしいので最初に一括エスケープするように方針変更。タグ中の改行はスペースに置き換えて対処。

javascript:with(document.body)(function(s,i,g,n){i=/&lt;(\/?(?:(a)|br|strong)\b\s?)((?:".*?"|'.*?'|[^>])*?)(?=\/?>)/gi,g=/\b(?:name|href)\s*=\s*(?:".*?"|'.*?'|[^\s>]*)/gi,n=/\r\n|[\r\n]|<br\s*>/gi;innerHTML=s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(i,function(_,t,A,a){return('<'+t+(A?(a.match(g)||[]).join(' '):'')).replace(n,' ')}).replace(n,'<br/>')})(innerHTML)
1
2
3
4
5
6
7
8
function doukaku57(s){
  var xOK = /&lt;(\/?(?:(a)|br|strong)\b\s?)((?:".*?"|'.*?'|[^>])*?)(?=\/?>)/gi,
      xNH = /\b(?:name|href)\s*=\s*(?:".*?"|'.*?'|[^\s>]*)/gi,
      xBR = /\r\n|[\r\n]|<br\s*>/gi;
  return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(xOK, function(_, tag, A, ats){
    return ('<'+ tag + (A ? (ats.match(xNH) || []).join(' ') : '')).replace(xBR, ' ');
  }).replace(xBR, '<br/>');
}

Index

Feed

Other

Link

Pathtraq

loading...