用HTML标记替换表达式

时间:2016-09-16 14:35:53

标签: javascript html

我需要解析一个文本(包含XML标记),然后用特定的类替换一些HTML标记的标记(根据其格式化)。 当我只在span输出中添加一个类时,我可以做得很好,但是当我添加多个类时,它会完全中断。

我不想创建两个&#34; class&#34;属性(我知道这不会起作用),而是我只是尝试连接:"<span=\"en " + class + "<\"/span>",其中en是第一个类,class是一个字符串变量。

当我没有必要添加此课程时,我没有使用此\",我只是放"<span= " + class + "</span>"并且它运行正常。我不确定为什么会有效,因为对我而言,它会在HTML中产生类似"<span class=x> y </span>的内容,而且类属性不起作用(因为缺少" ),但由于某种原因它有效(我很想理解为什么)。

我将此<span>添加到HTML的方式是通过替换:

text = text.replace(exp, t);
document.getElementById("myid").innerHTML = text;

t是我上面提到的连接。由于我要替换多个XML标记,因此我会在(exp.exec(text) == null)之前对其进行迭代,但我不相信问题就在那里。

有人可以向我解释我错过了什么吗?我不太了解JS,也不知道可能会发生什么。我想要解释一下我正在做什么的含义是什么,因为它打破了我的代码中另一个完全不同的部分......替换仍然有效(输出应该是<span class="en x"> y </span>),但是然后有奇怪的部分。

由于我所做的唯一更改是从<span class="x"> y </span><span class="en x"> y </span>,这不应该影响我的代码中的任何其他内容(我会解释)。我坚信这与逃脱的引号有关,但我不知道如何在没有引号的情况下完成这项工作。

打破的部分是: 我有一个文本加载在表单的textarea中。此文本是XML。有一个&#34;视觉模式&#34;激活我的功能的按钮(读取整个文本,用彩色跨度替换XML标签)。现在一切都很好。但是,用户可以返回文本区并编辑文本内容,例如添加更多标记的单词。然后点击&#34; Visual Mode&#34;再次。当我只添加一个类时,解析就好了。

但是在我进行了更改后,解析无法识别XML标记,而只是将文本原样并粘贴它!然后显然一切都崩溃了。我不明白的是为什么解析停止工作,因为我没有改变它如何读取文本,只是它如何取代它。我甚至没有替换我读到的同一个地方的文字,所以有一件事不应该影响另一个。

编辑: 我的XML看起来像:

<DOC DOCID="someid">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Aliquam at mauris <EM ID="someid" CATEG="somecateg">pellentesque </EM>, scelerisque purus condimentum, scelerisque purus. 
<EM ID="someid" CATEG="anothercateg">Mauris </EM>id libero vitae nulla fringilla vehicula. 
Integer varius  <EM ID="someid" CATEG="somecateg">lorem in </EM>nibh hendrerit facilisis. 
Nulla porttitor dui a lacus euismod bibendum. 
Proin in arcu eu magna laoreet suscipit id eget quam.
</DOC>

首先将XML内容加载到textarea(id&#34; myid&#34;代码如下),然后再操作。

我的工作是:

var exp = /<EM (.*?) <\/EM>/;
var text = document.getElementById("myid").value;
while(exp.exec(text) != null)
{
    var exp1 = /<EM ID=(.*?)<\/EM>/;
    var text1 = exp1.exec(text);
    var exp2 = /CATEG=\"(.*?)\"/;
    var text2 = exp2.exec(text1[1]);
    var categ = text2[1];
    var exp3 = /\">(.*?) <\/EM>/;
    var text3 = exp3.exec(text);
    var word = text3[1];
    var tag = "<span class=";
    var tag2 = ">";
    var tag3 = "</span> ";
    var t = tag + categ + tag2 + word + tag3;
    text = text.replace(exp, t);
}
document.getElementById("myid2").innerHTML = text;

因此,我从标签中提取出我想要的信息,然后将其替换为具有相应类的跨度,然后相应地对其进行格式化(通过CSS)。请注意,我所做的所有更改都没有反映在textarea上,而是放在div中(id&#34; myid2&#34;在上面的代码中)。但是,对textarea所做的任何更改都会反映在这个div上。因此,用户可以添加更多单词(标记或不标记)或删除任何内容。

但正如我在帖子中提到的那样,问题在于我尝试放两个类别。正如我的代码所示,var tag = "<span class=";工作正常,当我将代码更改为:

时会出现问题
var tag = "<span class=\"en ";
var tag2 = "\">";

当我点击&#34;视觉模式&#34;按钮优先(触发我的功能的按钮),所有标签都被正确解析和格式化,但如果我对textarea的内容进行任何更改并尝试再次单击可视模式,解析器会在我的编辑开始后立即中断。它停止识别标签,并按原样抛出所有XML标签。由于<em>本身是HTML标记,因此一切都变为斜体。我无法理解为什么添加引号会破坏我的解析,因为我甚至没有从我添加跨度的div中读取。他们根本没有关联。

1 个答案:

答案 0 :(得分:1)

根据原始帖子的第二个评论,&#34; 而不是转义引用等,请使用单引号双引号方法。单身开始和结束最多,所有孩子都加倍。&#34;

而不是:

var tag = "<span class=\"en ";
var tag2 = "\">";

示例:

var tag = '<span class="en "';
var tag2 = '>';

我相信这适用于许多编程语言。