2013-07-21 17 views
6

này liên quan đến một câu hỏi trước, ở đây: Converting a \u escaped Unicode string to ASCIIchuỗi Vệ sinh trong R

tôi đề xuất một giải pháp liên quan đến eval(parse(text=x)), mà cho người dùng không-R, có nghĩa là những gì nó nói: phân tích các chuỗi văn bản, sau đó đánh giá nó. Mục đích là không phải để cho phép mã tùy ý được thực hiện, nhưng chỉ để bỏ thoát khỏi văn bản Unicode đã thoát. Do đó giải pháp:

eval(parse(text=paste0("'", x, "'"))) 

Mặc dù điều này khá an toàn vì mục tiêu bị hạn chế, tôi muốn biết: cần bao nhiêu vệ sinh để giữ an toàn?

Ở mức tối thiểu, tôi đoán bất kỳ dấu ngoặc kép đơn và kép nào đều phải được thoát. Ví dụ: giả sử chúng tôi có

x <- "this is a '; print(dir()); 'string" 

Khi đó đoạn mã trên sẽ thực thi mã ở giữa. Vì vậy, chúng tôi phải thoát khỏi các dấu ngoặc kép:

eval(parse(text=paste0("'", 
         gsub("'", "\\\\'", x), 
         "'"))) 

Và tương tự cho dấu ngoặc kép. Tôi không nghĩ rằng unescaped Unicode tương đương \u0022\u0027 là một vấn đề, vì trình phân tích cú pháp chúng sẽ giống hệt với đơn thuần "'.

Có lỗ nào trong phương pháp này mà tôi đã bỏ lỡ không?

+0

Sẽ tốt hơn nếu có một cách để phân tích chuỗi thoát mà không có máy móc thiết bị (và rủi ro) của 'eval'! – seancarmody

+0

Tôi đã đưa ra một giải pháp thay thế mà không có 'eval': http://stackoverflow.com/a/17771985/1543437 – seancarmody

Trả lời

4
this is a \'; print(dir()); 'string 

đang trốn thoát đến:

'this is a \\'; print(dir()); 'string' 

đúp dấu chéo ngược được evaled như xuyệc ngược theo nghĩa đen, trích dẫn được kích hoạt, mã được thực thi.

Ngoài ra tôi không biết về R nhưng có lẽ bạn có thể ở mức tối thiểu gây ra sự cố bằng cách sử dụng các ký tự kiểm soát thô như dòng mới hoặc thoát không hợp lệ.

eval là trò chơi của một người nói chung. Xử lý chuỗi bình thường (chuỗi tìm kiếm cho chuỗi bạn muốn, thay thế nó) là cách tiếp cận tốt hơn và sử dụng thư viện hiện có cho một định dạng cụ thể được chỉ định đúng là tốt nhất. Ví dụ: nếu bạn có JSON, hãy sử dụng trình phân tích cú pháp JSON. Có rất nhiều định dạng chuỗi ký tự có thể sử dụng \u thoát, tất cả đều có các quy tắc hơi khác nhau, vì vậy bạn sẽ muốn chọn định dạng chính xác.

+0

Thực ra, trình phân tích cú pháp sẽ đưa ra lỗi trên đầu vào đó, vì vậy toàn bộ biểu thức (bao gồm cả mã nhúng) sẽ không bao giờ được đánh giá. Nhưng điều đó cũng không tốt lắm .... –

0

shQuote chức năng mà có thể làm việc cho bạn:

eval(parse(text=shQuote(x))) 
# [1] "this is a '; print(dir()); 'string"