替换纯文本字符串中的html元素

时间:2018-10-03 11:10:19

标签: javascript jquery

我有一个普通的字符串:

var text = '<p>hello</p> <iframe src="http://whatever.com/1"></iframe><iframe src="http://notsosure.com"></iframe><iframe src="http://whatever.com/2"></iframe><p>goodby</p>'

我需要从以src=http://whatever.com开头的字符串中删除每个iframe,并用指向相同网址的链接替换它们。

我以为我可以用jQuery做类似的事情:

$text = $(text)
$text
    .find("iframe[src^='http://whatever.com']")
    .replaceWith('<a href="' + $( this ).attr('src') + '"> Click Here</a>')

但是这不起作用,因为它返回替换后的字符串,并且不会修改我的原始$ text对象。

1 个答案:

答案 0 :(得分:4)

使用HTML解析器将使您处在正确的轨道上,而不是使用正则表达式(obligatory link)进行幼稚的文本处理。只是几件事:

  • 您的结构可能在顶层有<xsl:for-each select="/CUSTOMERS/PERSON"> <item> <CUST_ID> <xsl:value-of select="@customer_id" /> </CUST_ID> <FIRSTNAME> <xsl:value-of select="@first_name" /> </FIRSTNAME> <LASTNAME> <xsl:value-of select="@last_name" /> </LASTNAME> </item> </xsl:for-each> ,但是iframe在那里找不到它们。
  • 您必须继续:将其重新转换为字符串。

例如(见评论):

find
var text = '<p>hello</p> <iframe src="http://whatever.com/1"></iframe><iframe src="http://notsosure.com"></iframe><iframe src="http://whatever.com/2"></iframe><p>goodby</p>';
// Put them in a wrapper for convenience, so we don't have to worry about iframe
// elements at the top level
var wrapper = $("<div>");
wrapper.append(text);
// Find and replace the relevant iframe elements
wrapper.find("iframe[src^='http://whatever.com']").each(function() {
  $(this).replaceWith($("<a>").attr("href", this.src));
});
// Turn it back into text
text = wrapper.html();
console.log(text);