如何在javascript中替换特定的标记内容

时间:2012-06-19 11:33:41

标签: javascript regex

我有一个字符串,可能是也可能不是有效的HTML ,但它应该包含一个标题标签。
我想用新内容替换标题的内容。

示例1:

lorem yada yada <title>Foo</title> ipsum yada yada  

应该变成:

lorem yada yada <title>Bar</title> ipsum yada yada  

示例2:

lorem yada yada <title attributeName="value">Foo</title> ipsum yada yada  

应该变成:

lorem yada yada <title attributeName="value">Bar</title> ipsum yada yada  

我不想用正则表达式解析html - 只需替换标题标记...请不要发送给我here ...

编辑: 经过多次下来的投票和很多光顾的态度 -
我知道(正如原帖中所承认的)通常Regex不是处理HTML的方式。我对任何可以解决我的问题的解决方案持开放态度,但到目前为止,每个JQuery / DOM解决方案都无效。 “正确”是不够的。

3 个答案:

答案 0 :(得分:4)

function replaceTitle( str, replacement ) {
    var tmp = document.createElement("ihatechrome");
    tmp.innerHTML = str;
    tmp.getElementsByTagName("title")[0].innerHTML = replacement;
    return tmp.innerHTML;   
}

replaceTitle( "lorem yada yada <title>Foo</title> ipsum yada yada", "Bar" );
//"lorem yada yada <title>Bar</title> ipsum yada yada"

由于某些原因,如果img标记为src,Google Chrome会发出请求。没有任何意义,但这就是发生的事情。

编辑:

这似乎适用于chrome(不加载图片):

var doc = document.implementation.createHTMLDocument("");

doc.body.innerHTML = "<img src='/'>";

doc.body.innerHTML; //"<img src="/">"

答案 1 :(得分:3)

很难使用正则表达式可靠地执行此类操作(读取:“不适用于所有情况”),因此如果可能,使用某种正确的解析器是最好的。

那就是说,这是一个适用于你的例子的简单表达式:

var re = /(<title\b[^>]*>)[^<>]*(<\/title>)/i;
str = str.replace(re, "$1Bar$2");

有些事情没有处理,也无法正常使用:评论,引用,CDATA等。

答案 2 :(得分:0)

请上帝不要尝试用正则表达式解析html(我知道你说你没有解析它,但你是...)jQuery有一套非常好的基元来操纵不在的html DOM:

var htmlishString = "almost <title>HTML</title>";
var $fakeDiv = jQuery('<div />');
$fakeDiv.html(htmlishString).find('title').text('Bar');
var manipulatedString = $fakeDiv.html()

http://jsfiddle.net/4kQkx/