Замените все строки "<" и ">" в переменной на "<" и ">" - PullRequest
12 голосов
/ 23 мая 2011

В настоящее время я пытаюсь закодировать форму ввода, где вы можете набирать и форматировать текст для последующего использования в качестве записей XML. Чтобы сделать HTML-код доступным для чтения в формате XML, я должен заменить кодовые скобки на соответствующие коды символов, т.е. < на &lt; и > на &gt;.

Форматированный текст передается в виде HTML-кода с переменной inputtext , поэтому мы имеем, например, текст

The <b>Genji</b> and the <b>Heike</b> waged a long and bloody war.

который нужно преобразовать в

The &lt;b&gt;Genji&lt;/b&gt; and the &lt;b&gt;Heike&lt;/b&gt; waged a long and bloody war.

Я пробовал это с функцией .replace ():

inputxml = inputxml.replace("<", "&lt;");       
inputxml = inputxml.replace(">", "&gt;");

Но это только заменило бы первое вхождение скобок. Я почти уверен, что мне нужен какой-то цикл для этого; Я также пытался использовать функцию each() из jQuery (мой друг рекомендовал мне взглянуть на пакет jQuery), но я все еще плохо знаком с кодированием в целом, и у меня возникают проблемы с его работой.

Как бы вы закодировали цикл, который заменил бы скобки кода внутри переменной, как описано выше?

Дополнительная информация

Вы, конечно, правы, полагая, что это часть чего-то большего. Я аспирант по изучению японского языка, и в настоящее время я пытаюсь визуализировать информацию об истории Японии в более доступной форме. Для этого я использую API Simile Timeline, разработанный аспирантами MIT. Рабочий тест временной шкалы можно увидеть на моей домашней странице .

В Simile Timeline используется API на основе AJAX и Javascript. Если вы не хотите устанавливать движок AJAX на свой сервер, вы можете реализовать API временной шкалы из MIT. Данные для временной шкалы обычно предоставляются одним или несколькими файлами XML или файлами JSON. В моем случае я использую файлы XML; Вы можете взглянуть на структуру XML в в этом примере .

В пределах временной шкалы есть так называемые «события», по которым вы можете щелкнуть, чтобы раскрыть дополнительную информацию во всплывающем окне с информацией. Текст внутри этих информационных пузырей происходит из исходного файла XML. Теперь, если вы хотите выполнить некоторое форматирование HTML внутри информационных пузырей, вы не можете использовать кодовую скобку, потому что они будут отображаться в виде простого текста. Однако это работает, если вы используете коды символов вместо простых скобок.

Содержание хронологии будет написано людьми, совершенно и совсем не привыкшими к кодифицированной разметке, то есть историками, искусствоведами, социологами, среди которых несколько человек в возрасте 50 лет и старше. Я попытался объяснить им, как они должны форматировать XML-файл, если они хотят создать временную шкалу, но они иногда проскальзывают и расстраиваются, когда временная шкала не загружается, потому что они забыли закрыть скобку или включить апостроф ,

Чтобы упростить эту задачу, я попытался создать простую в использовании форму ввода, в которой вы можете ввести всю информацию и отформатировать текст в стиле WYSIWYG, а затем преобразовать его в код XML, который вам просто нужно скопировать и вставить в исходный файл XML. Большинство из них работает, хотя я все еще борюсь с преобразованием разметки текста в основном текстовом поле.

Преобразование скобок кода в код символа - это последнее, что мне нужно для работы, чтобы иметь рабочую форму ввода.

Ответы [ 5 ]

22 голосов
/ 23 мая 2011

посмотрите здесь:

http://www.bradino.com/javascript/string-replace/

просто используйте это регулярное выражение для замены всех:

str = str.replace(/\</g,"&lt;")   //for <
str = str.replace(/\>/g,"&gt;")   //for >
7 голосов
/ 23 мая 2011

Чтобы сохранить произвольную строку в XML, используйте собственные возможности XML браузера. Таким образом, это будет намного проще, плюс вам больше никогда не придется думать о крайних случаях (например, значениях атрибутов, которые содержат кавычки или заостренные скобки).

Подсказка для работы с XML: Никогда не создавайте XML из строк путем конкатенации, если есть какой-либо способ избежать этого . Вы будете так попадать в неприятности. Есть API для обработки XML, используйте их.

Исходя из вашего кода, я бы предложил следующее:

$(function() {

  $("#addbutton").click(function() {
    var eventXml = XmlCreate("<event/>");
    var $event   = $(eventXml);

    $event.attr("title", $("#titlefield").val());
    $event.attr("start", [$("#bmonth").val(), $("#bday").val(), $("#byear").val()].join(" "));

    if (parseInt($("#eyear").val()) > 0) {
      $event.attr("end", [$("#emonth").val(), $("#eday").val(), $("#eyear").val()].join(" "));
      $event.attr("isDuration", "true");
    } else {
      $event.attr("isDuration", "false");
    }

    $event.text( tinyMCE.activeEditor.getContent() );

    $("#outputtext").val( XmlSerialize(eventXml) );
  });

});

// helper function to create an XML DOM Document
function XmlCreate(xmlString) {
  var x;
  if (typeof DOMParser === "function") {
    var p = new DOMParser();
    x = p.parseFromString(xmlString,"text/xml");
  } else {
    x = new ActiveXObject("Microsoft.XMLDOM");
    x.async = false;
    x.loadXML(xmlString);
  }
  return x.documentElement;
}

// helper function to turn an XML DOM Document into a string
function XmlSerialize(xml) {
  var s;
  if (typeof XMLSerializer === "function") {
    var x = new XMLSerializer();
    s = x.serializeToString(xml);
  } else {
    s = xml.xml;
  }
  return s
}
2 голосов
/ 23 мая 2011

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace

Вы можете использовать регулярное выражение с флагом "g" (глобальное совпадение).

var entities = {'<': '&lt;', '>': '&gt;'};

'<inputtext><anotherinputext>'.replace(
    /[<>]/g, function (s) {
        return entities[s];
    }
);
1 голос
/ 23 мая 2011

Вы также можете окружить свои XML-записи следующим:

<![CDATA[...]]>

См. Пример:

<xml>
  <tag><![CDATA[The <b>Genji</b> and the <b>Heike</b> waged a long and bloody war.]]></tag>
</xml>

Статья в Википедии: http://en.wikipedia.org/wiki/CDATA

0 голосов
/ 23 мая 2011

Что вам действительно нужно, как упоминалось в комментариях, это XML-кодирование строки. Если вы абсолютно хотите сделать это с помощью Javascript, взгляните на функцию PHP.js htmlentities .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...