2013-05-05 37 views
13
htmlspecialchars($string, ENT_NOQUOTES); 

... là về 2,5 lần chậm hơn:Tại sao "htmlspecialchars" quá chậm?

str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $string); 

Liệu htmlspecialchars làm điều gì đó mà dòng str_replace không?

p.s. Tôi đã đo tốc độ bằng PHP 5.4, sử dụng microtime.

+3

@Juampi Hãy đâm vào những gì ENT_NOQUOTES có nghĩa là ... –

+5

Đây là nguồn https://github.com/php/php-src/blob/master/ext/standard/html.c Nó có thêm công việc để xem xét bộ ký tự trước, sử dụng các bộ thay thế thay thế cho danh sách str_replace cố định của bạn, v.v. – mario

+1

Sử dụng tốt hơn 'strtr' so với' str_replace'. Nhưng đó chỉ là một bình luận. – hakre

Trả lời

12

str_replace() coi chuỗi là chuỗi C ASCII. htmlspecialchars() thì không. (Đó là chuỗi UTF8 theo mặc định trong php 5.4, nếu bộ nhớ phục vụ.)

Ngoài ra, có mã trong htmlspecialchars() để tránh mã hóa kép, v.v.

+0

Bạn có thể đưa ra ví dụ về trường hợp có lợi khi sử dụng ' htmlspecialchars' trên 'str_replace'? –

+0

Bên cạnh các vấn đề mã hóa đôi, có lẽ là những trường hợp 'str_replace()' vui vẻ chấp nhận các chuỗi UTF8 không hợp lệ trong khi 'htmlspecialchars()' có thể sẽ không xảy ra. Nhớ lại lý do tại sao 'mysql_real_escape_string()' được giới thiệu trở lại trong ngày: do khả năng tiêm sql khi bạn không lo lắng về việc mã hóa. –

0

Tài liệu nêu rõ rằng htmlspecialchars() có tham số trong đó bạn có thể nhập bộ ký tự bạn muốn sử dụng và mã hóa cũng sẽ mã hóa mọi thứ hai lần theo mặc định.

2

Nhìn vào số documentation.

Lý do chậm hơn là vì nó hoạt động nhiều hơn. Nó xử lý các dấu ngoặc kép, mã hóa và mã hóa kép.

Làm việc với mã hóa có thể khá chậm. Bởi vì máy tính rất nhanh nên nó không quan trọng lắm, nhưng nếu bạn so sánh nó với một tìm kiếm đơn giản và thay thế (mà về cơ bản tất cả là str_replace sẽ làm) nó sẽ chậm hơn.

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