PHP dùng regex để lọc các thẻ script

Mình có đoạn code sau:

$text = file_get_contents('http://nhaxinh.com');
$pattern = '/<script.*?>+.*?<\/script>/';
$text = preg_replace($pattern, '', $text, -1, $count);
echo $count;
var_dump(htmlentities($text));

Dữ liệu lấy về có đến 19 đoạn bắt đầu bằng <script … nhưng đoạn regex của mình chỉ lọc được 5 cái…hjx hjx…Mình có test bằng cách copy text của đoạn html trên website và gán vào biến thì nó lại lọc được 19/19 luôn…vậy có phải vấn đề nằm ở đoạn file_get_contents ko? Vì sao nó lại bị như vậy?

Nhiều trang dùng trình duyệt thì xem được hết, nhưng khi dùng các hàm trong các ngôn ngữ lập trình lấy nội dung thì nó không được như thế.

  1. Trên trình duyệt dùng javascript để chèn dữ liệu thêm.
  2. Máy chủ chặn các truy cập không rõ nguồn gốc dựa vào thông tin được gửi (Request headers).
4 Likes

Bạn dùng document.scripts là nó tự lấy hết thẻ script trong trang HTML ra mà :smiley:

3 Likes

Đang dùng php để xóa các thẻ script trong html.
Vấn đề là không lấy được đầy đủ nội dung của web.

3 Likes

Now you have 2 problems. Thử tưởng tượng bạn muốn dùng regex để lọc < a > tag nhưng hóa ra có người lồng < a > tag vào < a > tag.
https://blog.codinghorror.com/parsing-html-the-cthulhu-way/

4 Likes

:smiley: https://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html

Kèm theo lí do vì sao gọi là regex. (không hàm ý ủng hộ dùng regex parse HTML)

2 Likes

Bạn này đang xóa thẻ script mà, chắc ko có ông nào dùng js để append thêm thẻ script đâu.

Đoạn regex của bạn hơi đơn giản ko bắt đc hết trường hợp thôi, bạn có thể sài đoạn sau nhé:

<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>

của m 19/19 https://regex101.com/r/A8VAtB/1
của bạn chỉ 4/19 thôi https://regex101.com/r/9t1TUE/1

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?