Javascript 复杂html字符串.replace函数

Javascript 复杂html字符串.replace函数,javascript,html,regex,string,replace,Javascript,Html,Regex,String,Replace,我有一个非常简单的html,它是由jSon数据库中的字符串生成的,如下所示: "<div style=\"padding-top:59px;\"><a href=\"http://www.macm.org/en/index.html\"><img src=\"http://www.artimap.com/montreal/www.macm.org.jpg\"><br>www.macm.org/en/index.html</a><h

我有一个非常简单的html,它是由jSon数据库中的字符串生成的,如下所示:

"<div style=\"padding-top:59px;\"><a href=\"http://www.macm.org/en/index.html\"><img src=\"http://www.artimap.com/montreal/www.macm.org.jpg\"><br>www.macm.org/en/index.html</a><h1>Musée d'art contemporain de Montréal</h1><p></p><p>A major Canadian institution dedicated exclusively to contemporary art, the Musée offers a varied program ranging from presentations of its Permanent Collection to exhibitions of works by Québec, Canadian and international artists. The Permanent Collection comprises some 7,000 works, including the largest collection of art by Paul-Émile Borduas.</p><div><p>185, Sainte-Catherine West (corner Jeanne-Mance)</p><p>H2X 3X5</p></div><b>514 847-6226</b></div>"
“当代艺术博物馆在加拿大的一个主要机构,专门致力于当代艺术,博物馆提供各种各样的项目,从展示其永久收藏到魁北克、加拿大和国际艺术家的作品展览。永久藏品包括约7000件作品,其中包括保罗·埃米尔·博尔杜亚斯的最大艺术品收藏。

185,圣凯瑟琳·韦斯特(珍妮·曼斯角)

514 847-6226”
一个变量RESULTSshow是这些字符串的串联,另一个变量:searchterm是搜索词。我想用HTMl searchterm将搜索词出现在结果中,我使用这些regexp和函数来表示我感兴趣的每个标记,例如:

var REG=new RegExp(searchterm,'gmi');
var regFUN=function(x){return x.replace(REG,"<i>$&</i>");};
var reg = new RegExp('<p>(.*?)</p>','gmi');
RESULTSshow=RESULTSshow.replace(reg,regFUN);
(I do this for every tags I am interested in highlighting) 
This does <i>"searchterm"</i> but also gives <<i>p</i>> if searchterm==="p" wich really bugs me for the two last days.
var REG=new RegExp(searchterm,'gmi');
var regFUN=函数(x){return x.replace(REG,“$&”);};
var reg=new RegExp(“(.*?

”,“gmi”); resultshow=resultshow.replace(reg,regFUN); (我对我感兴趣的每个标记都这样做) 这确实是“searchterm”,但如果searchterm==“p”的话也会给出,这两天我都很烦。
问题是,如果searchterm为“p”,则不仅会更改标记内的文本,还会更改标记本身


如何阻止它更改标记?我真的很想使用regExp来执行此操作,而不是为了提高速度而在html(dom)中循环。

好吧,考虑到您的html不包含脚本、CDATA、样式等块,使用lookahead:

text = text.replace(/(?![^<>]*>)old/g, 'new');
text=text.replace(/(?![^]*>)old/g,“new”);
虽然我会使用轻型解析器或自行开发的解析器,但不必担心速度以获得更好的支持。请注意,如果属性可能包含
字符,则需要处理源代码

试试这个:

<html>
<head>
<script>
function t() {
    text = "<html><head></head><body><p>SuperDuck</p><p>Jumps over the lazy dog</p></body></html>";
    a = text.replace(/(?![^<>]*>)(p)/g, '<i>$1</i>');
    alert (a);
}
</script>
</head>
<body>
    <button onclick="t();">hit me!</button>
</body>
</html>

函数t(){
text=“SuperDuck

跳过懒狗”

; a=文本。替换(/(?![^]*>)(p)/g,“$1”); 警报(a); } 打我!

只需替换替换字符串中的
(p)
,就可以跳过=)

现在使用这个奇妙的小RegExp,而不是过于复杂的第一个:

REG=new RegExp("(?![^<>]*>)("+searchterm+")","gi");
RESULTSshow=RESULTSshow.replace(REG,'<i>$1</i>');
REG=newregexp(“(?![^]*>)(“+searchterm+”),“gi”);
resultshow=resultshow.replace(REG,$1');

用正则表达式解析HTML?你最好编辑问题标题…我不会称之为“简单”。你不能区分普通文本中的“p”和“p”“在标记内部,而不分析DOM。使用regex肯定不可靠,尤其是使用一种甚至不支持lookbehind断言的regex风格。idealmachine,它不像解析任何html,它用于解析非常简单的标记:h1、p和b标记,它们都没有任何属性或其他。在我看来,这对regExp来说是一个完美的工作。阴影向导你说得对,我编辑了标题。我需要在文本中找到一些“搜索词”,然后将其包含在I标记中。我发送的REGEX确实做到了这一点。parantesses
(p)
中的部分是搜索词,
$1
是如何用
i
标签包装的,
$1
是替换版本中的搜索词。只需运行代码就可以看到搜索词“p”被替换为
p
,但不是
标记。是的,这似乎是可行的,我尝试过:函数t(){text=“SuperDuck

跳过懒狗”;“a=text.replace(/(?![^]*>)(p)/g,$1');document.getElementById('rep').innerHTML=a;}I{background none:yellow;}打我!谢谢Sylvain,是朝着正确的方向迈出了一步,还是正好有效?=)我以为你在追求regex公式?如果是,请单击答案左侧的复选框大纲,毫不犹豫地将其标记为已接受答案。这让其他人知道你的问题得到了很好的答案。这样做很有帮助,因为它向其他人表明你从社区中获得了价值。SuperDuck功能似乎是朝着正确方向迈出的一大步!