Thay thế các từ trong nội dung văn bản


94

Có cách nào để thay thế văn bản bình thường trong một phần tử bảng được đặt trong phần nội dung của HTML không?

Giống như thay thế "xin chào" bằng "chào"?

Vui lòng chỉ sử dụng JavaScript mà không có jQuery .


Anh lam ơn cụ thể chut hơn được không? Bạn muốn thay cái gì, nó nằm ở đâu trong cơ thể, v.v.
Zirak

cơ thể có một div và trong đó một bảng, sau đó tôi muốn thay thế một số văn bản bình thường không mã như thay thế ( "hello") với ( "hi")
Wahtever

3
hầu hết các giải pháp dưới đây sẽ phá hủy tất cả các sự kiện và cấu trúc dom toàn nếu chữ bị thay thế đã xảy ra là tên lớp, tên thẻ hoặc bất cứ điều gì trong html
Muhammad Umer

Có vẻ như cả câu hỏi và câu trả lời đều sai. Nó hỏi cách thay thế các từ chứ không phải ký tự. Chẳng hạn như thay thế này hello, this is a text randomTexthellonên được hi, this is a text randomTexthello. Tuy nhiên, tất cả các câu trả lời khác ở đây thay thế các ký tự thay vì từ.
Orhun Alp Oral

Câu trả lời:


139

Để thay thế một chuỗi trong HTML của bạn bằng một chuỗi khác, hãy sử dụng phương thức thay thế trên innerHTML :

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

Lưu ý rằng điều này sẽ thay thế phiên bản đầu tiên của hellotoàn bộ nội dung, bao gồm bất kỳ phiên bản nào trong mã HTML của bạn (ví dụ: tên lớp, v.v.), vì vậy hãy sử dụng thận trọng - để có kết quả tốt hơn, hãy thử giới hạn phạm vi thay thế của bạn bằng cách nhắm mục tiêu mã của bạn bằng document.getElementById hoặc tương tự.

Để thay thế tất cả các phiên bản của chuỗi đích, hãy sử dụng một biểu thức chính quy đơn giản với gcờ lobal:

document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

1
didnt làm việc cho tôi ở đây là những gì tôi sử dụng <script type="text/javascript"> window.onload = clear(); function clear() { document.body.innerHTML = document.body.replace('ü', 'n'); } </script>
Wahtever

Nó có thể phức tạp hơn với các ký tự mở rộng - tài liệu của bạn đang ở dạng mã hóa nào? Bạn có chắc chắn rằng ký tự là một ü chứ không phải & # 252; ví dụ..?
Dexter

2
bạn đã không sao chép chính xác mã của tôi ;-) hãy đảm bảo rằng bạn có innerHTML ở cả hai mặt của câu lệnh, tức là: document.body.innerHTML = document.body.innerHTML.replace ('ü', 'n');
Dexter

3
FYI - Lỗi trong nhận xét đầu tiên là: đặt window.onload = clear;không có dấu ngoặc đơn "()". Khi bạn viết clear()thì bạn thực sự thực hiện chức năng, nhưng bạn chỉ muốn gán chức năng cho onload-handler
Philipp

1
Lưu ý rằng việc sử dụng innerHTML thường được coi xấu những ngày này: slideshare.net/x00mario/the-innerhtml-apocalypse
kufudo

13

Chức năng bên dưới hoạt động hoàn hảo đối với tôi:

// Note this *is* JQuery, see below for JS solution instead
function replaceText(selector, text, newText, flags) {
  var matcher = new RegExp(text, flags);
  $(selector).each(function () {
    var $this = $(this);
    if (!$this.children().length)
       $this.text($this.text().replace(matcher, newText));
  });
}

Đây là một ví dụ sử dụng:

function replaceAllText() {
  replaceText('*', 'hello', 'hi', 'g');
}

$(document).ready(replaceAllText);
$('html').ajaxStop(replaceAllText);

Bạn cũng có thể sử dụng thay thế trực tiếp như sau:

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

Nhưng hãy cẩn thận với nó vì nó có thể ảnh hưởng đến các thẻ, css và script.

CHỈNH SỬA: Đối với một giải pháp JavaScript thuần túy, hãy sử dụng phương pháp này để thay thế:

function replaceText(selector, text, newText, flags) {
  var matcher = new RegExp(text, flags);
  var elems = document.querySelectorAll(selector), i;

  for (i = 0; i < elems.length; i++)
    if (!elems[i].childNodes.length)
      elems[i].innerHTML = elems[i].innerHTML.replace(matcher, newText);
}

Làm thế nào để thay thế tất cả văn bản trong một thẻ cụ thể (như <p> hoặc <span>) bằng một số văn bản khác?
GJZ

Chỉ cần thêm tên thẻ (s) để đầu vào đầu tiên tham số ví dụ replaceText ( 'p, khoảng', 'hello', 'hi')
Ziad

Điều này không hoạt động chính xác. Hãy xem xét điều này: <p> xin chào <strong> thế giới </strong> </p>. xin chào không được thay thế.
David Vielhuber,

Xin chào, tôi mới bắt đầu viết mã. Tôi có thể làm một số điều tốt với AppleScript. Nhưng đó là tất cả những gì tôi biết. Bạn có thể vui lòng cho tôi một số lời khuyên, bắt đầu với mục đích của tôi là sử dụng javascript để tự động thu thập cơ sở dữ liệu, hình ảnh, video, điền biểu mẫu web, tải lên, có thể là để làm việc với excel. Applescript ổn với nó nhưng java dường như là một cấp độ hoàn toàn mới và tốt hơn nhiều. Tôi nên bắt đầu với điều gì để đạt được mục đích của mình. Tôi biết 0 về javascript và tôi thậm chí không biết cách làm cho tập lệnh của bạn ở trên hoạt động! Tôi muốn dán nó vào đâu? Cảm ơn bạn rất nhiều!
Duy Duy

10

Tôi đã kết thúc với chức năng này để thay thế văn bản một cách an toàn mà không có tác dụng phụ (cho đến nay):

function replaceInText(element, pattern, replacement) {
    for (let node of element.childNodes) {
        switch (node.nodeType) {
            case Node.ELEMENT_NODE:
                replaceInText(node, pattern, replacement);
                break;
            case Node.TEXT_NODE:
                node.textContent = node.textContent.replace(pattern, replacement);
                break;
            case Node.DOCUMENT_NODE:
                replaceInText(node, pattern, replacement);
        }
    }
}

Nó dành cho những trường hợp 16kB findAndReplaceDOMTexthơi quá nặng.


Xin chào, tôi mới bắt đầu viết mã. Tôi có thể làm một số điều tốt với AppleScript. Nhưng đó là tất cả những gì tôi biết. Bạn có thể vui lòng cho tôi một số lời khuyên, bắt đầu với mục đích của tôi là sử dụng javascript để tự động thu thập cơ sở dữ liệu, hình ảnh, video, điền biểu mẫu web, tải lên, có thể là để làm việc với excel. Applescript ổn với nó nhưng java dường như là một cấp độ hoàn toàn mới và tốt hơn nhiều. Tôi nên bắt đầu với điều gì để đạt được mục đích của mình. Tôi biết 0 về javascript và tôi thậm chí không biết cách làm cho tập lệnh của bạn ở trên hoạt động! Tôi muốn dán nó vào đâu? Cảm ơn bạn rất nhiều!
Duy Duy

Duy Duy, vấn đề là nhiều rồi. Chỉ với bản mô tả nhiệm vụ, là lý do đủ để bỏ việc.
funky-future

9

Tôi đã từng gặp vấn đề tương tự. Tôi đã viết hàm của riêng mình bằng cách sử dụng thay thế trên innerHTML, nhưng nó sẽ làm hỏng các liên kết neo và tương tự.

Để làm cho nó hoạt động chính xác, tôi đã sử dụng một thư viện để thực hiện việc này.

Thư viện có một API tuyệt vời. Sau khi bao gồm tập lệnh, tôi gọi nó như thế này:

findAndReplaceDOMText(document.body, {
  find: 'texttofind',
  replace: 'texttoreplace'
  }
);

Đây là giải pháp duy nhất phù hợp với vấn đề của tôi. Tôi cần sử dụng REGEX để tìm và thay thế số điện thoại trên toàn bộ trang web và các câu trả lời khác ở đây sẽ phá vỡ các sự kiện DOM của tôi.
DavyH

3

Tôi đang cố gắng thay thế một chuỗi thực sự lớn và vì lý do nào đó mà các biểu thức chính quy đang tạo ra một số lỗi / ngoại lệ.

Vì vậy, tôi đã tìm thấy sự thay thế này cho các biểu thức chính quy cũng chạy khá nhanh. Ít nhất thì nó đủ nhanh đối với tôi:

var search = "search string";
var replacement = "replacement string";

document.body.innerHTML = document.body.innerHTML.split(search).join(replacement)

src: Làm thế nào để thay thế tất cả các lần xuất hiện của một chuỗi trong JavaScript?


2

Sử dụng hàm thay thế chuỗi javascript mặc định

var curInnerHTML = document.body.innerHTML;
curInnerHTML = curInnerHTML.replace("hello", "hi");
document.body.innerHTML = curInnerHTML;

1

Hãy thử áp dụng giải pháp được đề xuất ở trên trên tài liệu khá lớn, thay thế các chuỗi khá ngắn có thể có trong innerHTML hoặc thậm chí là innerText, và thiết kế html của bạn tốt nhất sẽ bị hỏng

Do đó, trước tiên tôi chỉ lấy các phần tử nút văn bản thông qua các nút HTML DOM, như thế này

function textNodesUnder(node){
  var all = [];
  for (node=node.firstChild;node;node=node.nextSibling){
    if (node.nodeType==3) all.push(node);
    else all = all.concat(textNodesUnder(node));
  }
  return all;
}

textNodes=textNodesUnder(document.body)
for (i in textNodes) { textNodes[i].nodeValue = textNodes[i].nodeValue.replace(/hello/g, 'hi');    

`và sau đó tôi đã áp dụng thay thế cho tất cả chúng theo chu kỳ


1

Tôi muốn thêm một ví dụ vào câu trả lời của funky-future vì tôi liên tục gặp lỗi này:

Uncaught TypeError: element.childNodes is not iterable

sử dụng như thế này:

replaceInText(document.body,"search term","replacement");

nó không hoạt động với tôi với bộ chọn jQuery.


1
Nếu bạn có câu hỏi mới, vui lòng đặt câu hỏi bằng cách nhấp vào nút Đặt câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp ngữ cảnh. - Từ đánh giá
SilverNak

1
Đây không phải là một câu hỏi mới, tôi đã mở rộng câu trả lời của funky-future bằng cách cung cấp một ví dụ hoạt động. đã phải đăng một câu trả lời mới bc Tôi thiếu đại diện để bình luận về của mình.
Y Stroli

0

Tôi là người mới Javascriptvà chỉ mới bắt đầu học những kỹ năng này. Vui lòng kiểm tra xem phương pháp dưới đây có hữu ích để thay thế văn bản hay không.

<script>

    var txt=document.getElementById("demo").innerHTML;
    var pos = txt.replace(/Hello/g, "hi")
    document.getElementById("demo").innerHTML = pos;

</script>

0

Đôi khi việc thay đổi làm document.body.innerHTMLhỏng một số tập lệnh JS trên trang. Đây là phiên bản, chỉ thay đổi nội dung của textcác phần tử:

function replace(element, from, to) {
    if (element.childNodes.length) {
        element.childNodes.forEach(child => replace(child, from, to));
    } else {
        const cont = element.textContent;
        if (cont) element.textContent = cont.replace(from, to);
    }
};

replace(document.body, new RegExp("hello", "g"), "hi");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.