【问题标题】:How to replace a specific tag content in javascript如何在javascript中替换特定标签内容
【发布时间】:2012-06-19 11:33:41
【问题描述】:

我有一个字符串,可能是也可能不是有效的 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 解决方案都不起作用。 “正确”是不够的。

【问题讨论】:

  • 这在 jQuery 中很简单。这是一个选择吗?
  • @HackedByChinese - 不。正如我在问题中提到的,我有一个可能不是 html 的字符串。
  • document.getElementsByTagName("head")[0].getElementsByTagName("title")[0].innerHTML="Bar";
  • @seldary 我明白这一点。这个事实不会限制 jQuery 作为一个选项。
  • 我没有编辑我正在运行的页面!我有一个用户输入的字符串,我想对其进行操作...

标签: javascript regex


【解决方案1】:

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

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

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

这不能处理并且不能正常工作的一些东西:cmets、quotes、CDATA 等。

【讨论】:

    【解决方案2】:
    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"
    

    出于某种原因,如果有带有srcimg 标签,谷歌浏览器会发出请求。没有任何意义,但这就是发生的事情。

    编辑:

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

    var doc = document.implementation.createHTMLDocument("");
    
    doc.body.innerHTML = "<img src='/'>";
    
    doc.body.innerHTML; //"<img src="/">"
    

    【讨论】:

    • 这不会执行任何&lt;script&gt;s 或加载字符串中可能存在的图像吗?
    • 除了标题的内部文本之外的文本是否有可能被更改?哪怕是一点点?
    • 它将加载图像但不执行脚本或样式标签
    • @Esailija - 这就是我想到正则表达式的原因......我不想要任何副作用。只是为了替换字符串。
    • @seldary 很好,所以使用正则表达式
    【解决方案3】:

    请上帝不要尝试用正则表达式解析 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/

    【讨论】:

    • 你测试过这个吗?第三行抛出“Uncaught TypeError: Cannot read property 'slice' of undefined”。
    • @seldary 它在 chrome 中工作,但我没有在任何其他浏览器中测试
    • 它也适用于 FF。不确定我是否理解该链接的相关性
    • 诚然,这似乎也遭受了 chrome 中的获取脚本错误
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2020-06-17
    • 2013-12-07
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多