改行をBRタグに置き換える
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, '&').replace(/</g, '<').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=/<(\/?(?:(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,'&').replace(/</g,'<').replace(i,function(_,t,A,a){return('<'+t+(A?(a.match(g)||[]).join(' '):'')).replace(n,' ')}).replace(n,'<br/>')})(innerHTML)
javascript:with(document.body)(function(s,i,g,n){i=/<(\/?(?:(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,'&').replace(/</g,'<').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 = /<(\/?(?:(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,'&').replace(/</g,'<').replace(xOK, function(_, tag, A, ats){
return ('<'+ tag + (A ? (ats.match(xNH) || []).join(' ') : '')).replace(xBR, ' ');
}).replace(xBR, '<br/>');
}
|


にしお
#3413()
Rating-2/2=-1.00
また、ユーザの入力注の<br>は<br/>に変換してください。
このお題はperezvonさんの提案を元にした三部作の二問目です。ご協力ありがとうございました。
[ reply ]