4

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

示例 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 - 只需替换标题标签......请不要把我发到这里......

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

4

3 回答 3

5

使用正则表达式很难可靠地做这样的事情(阅读:“不适用于所有情况”),因此如果可能的话,最好使用某种适当的解析器。

也就是说,这是一个适用于您的示例的简单表达式:

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

一些这不能处理并且不能正常工作的事情:评论、引用、CDATA 等。

于 2012-06-19T12:03:19.313 回答
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. 没有任何意义,但这就是发生的事情。

编辑:

这似乎在 chrome 中工作(不加载图像):

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

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

doc.body.innerHTML; //"<img src="/">"
于 2012-06-19T11:36:30.150 回答
0

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

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/

于 2012-06-19T23:17:07.310 回答