Очистка атрибутов HTML-тегов - PullRequest
4 голосов
/ 04 ноября 2010

Мне нужно пройтись по большому количеству HTML, используя JavaScript, чтобы настроить синтаксис цитаты атрибута так, чтобы он был двойными кавычками.Мне не нужно беспокоиться об атрибутах «только ключ», таких как «отключен» или «выбран».

Вот мой текущий тестовый пример:

var text = "<input class=daily_input type='hidden' size='1' value=3 disabled />";
var regex = /<([\w]+)([^>]+)([\w]+)=['"]?([^'\s|"\s|\s]*)['"]?([^>]+)>/gi;
text = text.replace( regex, "<$1$2$3=\"$4\"$5>" );

console.log(text); // logs <input class=daily_input type='hidden' size='1' value="3" disabled />

Похоже, он все еще только корректируетсяпоследний атрибут.Я могу легко проверять совпадения с помощью регулярного выражения находить / заменять в TextMate, и каждый атрибут в текстовом теге HTML будет соответствовать следующему:

/([\w]+)=['"]?([^'\s|"\s|\s]*)['"]?/gi

Как изменить это, чтобы перехватывать и корректировать каждыйатрибут, а не только последний?Давненько возился с ним безрезультатно.Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010
text.replace(/='([^']*)'/g, '="$1"').replace(/=([^"'][^ >]*)/g, '="$1"')

Или (одна замена):

text.replace(/='([^']*)'|=([^"'][^ >]*)/g, '="$1"')
1 голос
/ 05 декабря 2014

Я знаю, что это поздний ответ, но если вы всегда можете использовать sanitize-html Он написан для узла, но уверен, что вы можете запустить browserify против библиотеки (или код в этом отношении).

Обратите внимание, что он использует lodash, поэтому, если вы уже используете его, вы можете настроить пакет.

Этот пример - больше, чем вы ищете ... Я использую эту библиотеку для очистки входного кода, конвертирования в уценку для хранения в БД отсюда, я повторно гидратирую через помеченный .

// convert/html-to-filtered-markdown.js

'use strict';

var sanitize = require('sanitize-html') //https://www.npmjs.org/package/sanitize-html
    ,toMarkdown = require('to-markdown').toMarkdown
    ;

module.exports = function convertHtmlToFilteredMarkdown(input, options) {
  if (!input) return '';

  options = options || {};

  //basic cleanup, normalize line endings, normalize/reduce whitespace and extra line endings
  var response = (input || '').toString().trim()
    .replace(/(\r\n|\r|\n)/g, '\n') //normalize line endings
    .replace(/“/g, '"') //remove fancy quotes
    .replace(/”/g, '"') //remove fancy quotes
    .replace(/‘/g, '\'') //remove fancy quotes
    .replace(/’/g, '\'') //remove fancy quotes
    ;

  //sanitize html input
  response = sanitize(response, {
    //don't allow table elements
    allowedTags: [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'p', 'a', 'ul', 'ol', 'nl', 'li', 'b', 'i', 'strong', 'em', 'strike', 'code', 'hr', 'br', 'div', 'table', 'thead', 'caption', 'tbody', 'tr', 'th', 'td', 'pre' ],

    //make orderd lists
    transformTags: {
      'ol': 'ul'
    }
  }).replace(/\r\n|\r|\n/g,'\n') //normalize line endings;

  if (!options.tables) {
    response = response.replace(/[\s\n]*\<(\/?)(table|thead|tbody|tr|th|td)\>[\s\n]*/g, '\n\n') //replace divs/tables blocks as paragraphs
  }

  //cleanup input further
  response = response
    .replace(/[\s\n]*\<(\/?)(div|p)\>[\s\n]*/g, '\n\n') //divs and p's to simple multi-line expressions
    .replace(/\>#/g, '\n\n#') //cleanup #'s' after closing tag, ex: <a>...</a>\n\n# will be reduced via sanitizer
    .replace(/\\s+\</,'<') //remove space before a tag open
    .replace(/\>\s+\n?/,'>\n') //remove space after a tag close
    .replace(/\&?nbsp\;?/g,' ') //revert nbsp to space
    .replace(/\<\h[12]/g,'<h3').replace(/\<\/\h[12]/g,'</h3') //reduce h1/h2 to h3
    ;

  //convert response to markdown
  response = toMarkdown(response);

  //normalize line endings
  response = response
    .replace(/(?:^|\n)##?[\b\s]/g,'\n### ') //reduce h1 and h2 to h3
    .replace(/(\r\n|\r|\n)/g, '\n') //normalize line endings
    .trim()

  return response + '\n';
}
...