Заменить весь текст, за исключением атрибутов alt или href
Я хочу заменить весь сопоставленный текст другим текстом, но не хочу заменять, если этот текст находится в alt
или же href
приписывать. Пример:
<p>Hello world!</p>
<p><img src="hello.jpg" alt="Hello"/></p>
Hello
Мой код:
var replacepattern = new RegExp('Hello', 'gi');
newcontent = newcontent.replace(replacepattern, function(match, contents, offset, s) {
var link = 'demo.com'
index++;
if (link != '') {
return '<a href="' + link + '">' + match + '</a>';
} else {
return match;
}
});
Он прекрасно работает только с текстом. Как я могу сопоставить текст, кроме img src
, alt
так далее?
1 ответ
Вы можете использовать сам jQuery, чтобы помочь вам с заменой:
$(html)
.contents()
.filter(function() {
return this.nodeType == 1 || this.nodeType == 3;
}).each(function() {
this.textContent = this.textContent.replace(replacepattern, 'whatever');
});
Обратите внимание, что последнее появление Hello
не заменяется, поскольку технически недопустимо иметь текстовый узел в качестве дочернего элемента <body>
,
Кроме того, вам придется изменить его для работы в IE < 9 или 10; в основном браузер должен поддерживать node.textContent
:)
Обновить
Проблема была немного сложнее; или, может быть, мой разум делает это сложнее, чем есть. Заменить текстовые узлы с помощью jQuery не так просто, поэтому для этого необходим какой-то чистый JS:
$('<div><p>Hello world!</p><p><img src="hello.jpg" alt="Hello"/></p>Hello</div>')
.find('*')
.andSelf()
.each(function() {
for (var i = 0, nodes = this.childNodes, n = nodes.length; i < n; ++i) {
if (nodes[i].nodeType == 3) {
var txt = nodes[i].textContent || nodes[i].innerText,
newtxt = txt.replace(/Hello/g, 'Bye');
if (txt != newtxt) {
var txtnode = document.createTextNode(newtxt);
this.replaceChild(txtnode, nodes[i]);
}
}
}
})
.end()
.end()
.appendTo('body');