2011-11-13 38 views
10

Hoặc bất kỳ thẻ nào khác :)Trích xuất thẻ tập lệnh từ chuỗi HTML

ví dụ:

<head> 
    <title>page...</title> 
    <script> var a = 'abc'; </script> 
    <script src="foo.js" type="text/javascript"></script> 
    </head> 
    <body> 
    ... 
    <script src="foo2.js"></script> 
    </body> 

(chuỗi này là một phản ứng từ một cuộc gọi ajax)

Tôi muốn có được một mảng với 3 dây:

  1. <script> var a = 'abc'; </script>
  2. <script src="foo.js" type="text/javascript"></script>
  3. <script src="foo2.js"></script>

Tôi có thể làm như thế nào?

Trả lời

6

Xác định: outerHTML chức năng (lấy từ here)

jQuery.fn.outerHTML = function(s) { 
return (s) ? this.before(s).remove() : jQuery("&lt;p&gt;").append(this.eq(0).clone()).html(); 
} 

Sau đó, giả định phản ứng của bạn được lưu trữ trong data bạn có thể làm:

$(data).filter("script").each(function(e) { 
    // do something with $(e).outerHTML() 
}); 
+2

trong một chuỗi phẳng như đáp ứng OP là '.find()' sẽ không khớp với bất kỳ thứ gì. sử dụng '.filter()' để thay thế. – jAndy

+0

@jAndy Bạn đã đúng. Câu trả lời được cập nhật – Strelok

+0

cảm ơn bạn đã kết thúc tìm kiếm 1 giờ –

2

Sử dụng cụm từ thông dụng với mẫu <script[^<]*</script>.

+1

Cụm từ thông dụng để khớp các thẻ HTML phức tạp hơn điều này. Tôi không nghĩ đây là một câu trả lời rất hay. Tại sao lại bận tâm khi tất cả công việc đã được thực hiện cho bạn bởi trình duyệt rồi. – Strelok

+1

'

'không thể giữ, quá muộn .... – jAndy

+0

@Strelok OK, nhưng chuỗi được phân tích cú pháp là" phản hồi từ cuộc gọi ajax ". Alex đã không nói rằng mã HTML này sẽ được chèn vào trang. Nếu nó không phải là bạn không thể sử dụng cây DOM, và các kỹ thuật dựa trên nó, như jQuery ... – kol

1

Bạn có thể thử một cái gì đó như:

function getScriptsAsText() { 
    var div = document.createElement('div'); 
    var scripts = []; 
    var scriptNodes = document.getElementsByTagName('script'); 

    for (var i=0, iLen=scriptNodes.length; i<iLen; i++) { 
    div.appendChild(scriptNodes[i].cloneNode(true)); 
    scripts.push(div.innerHTML); 
    div.removeChild(div.firstChild); 
    } 
    return scripts; 
} 

Nó trả về một mảng các phần tử kịch bản hiện tại dưới dạng văn bản, bao gồm cả thẻ bắt đầu và kết thúc của chúng.

Bạn cũng có thể thử bên ngoàiHTML, nhưng nó không được hỗ trợ rộng rãi.

+0

để làm việc này, bạn sẽ cần phân tích cú pháp chuỗi html thành tài liệu. https://developer.mozilla.org/en-US/docs/Code_snippets/HTML_to_DOM?redirectlocale = vi-US & redirectslug = Code_snippets% 3AHTML_to_DOM –

Các vấn đề liên quan