2010-07-01 37 views
5

Cách tốt nhất để xóa các thẻ này khỏi chuỗi là gì, để chuẩn bị cho việc chuyển đến eval()?PHP - Xóa <?php ?> thẻ khỏi chuỗi

ví dụ: chuỗi có thể được một cái gì đó như thế này:

<?php 
    echo 'hello world'; 
    ?> 
    Hello Again 
    <?php 

    echo 'Bye'; 
?> 

Rõ ràng str_replace sẽ không làm việc vì hai thẻ php trong nhu cầu giữa để có mặt ở đó (các ngày 1 và nhu cầu cuối cùng phải được loại bỏ)

+1

Tại sao bạn muốn thực hiện việc này? Nó có mùi như một ý tưởng tồi. – alex

+1

Câu trả lời là bạn không sử dụng 'eval'. ;) (Chỉ 25% nói đùa thực sự.) – deceze

+3

Tôi đã sử dụng eval một lần, con chó chết, câu chuyện có thật. –

Trả lời

4

Âm thanh giống như một ý tưởng tồi, nhưng nếu bạn muốn bắt đầu và kết thúc những người bỏ bạn có thể làm

$removedPhpWrap = preg_replace('/^<\?php(.*)(\?>)?$/s', '$1', $phpCode); 

này nên làm điều đó (không kiểm tra).

Xin vui lòng cho tôi biết lý do tại sao bạn muốn làm điều đó, tôi 95% chắc chắn có một cách tốt hơn.

+0

hoạt động, cảm ơn: D – Alex

+0

+1 ngay cả đối với điều khoản đầu tiên. –

+1

điều gì về php mà không có '?>'? : P – MysteryDev

4

Thông thường, bạn sẽ không muốn chuyển hàm để đánh giá. Nếu bạn chỉ muốn xóa các thẻ, string_replace sẽ thực hiện công việc tốt, tuy nhiên bạn có thể sử dụng regex tốt hơn.

preg_replace(array('/<(\?|\%)\=?(php)?/', '/(\%|\?)>/'), array('',''), $str);

này bao gồm các thẻ cũ-asp, php ngắn thẻ, thẻ php echo, và các thẻ php bình thường.

+0

Tôi nghĩ rằng anh ấy chỉ muốn bắt đầu và kết thúc những người bị loại bỏ, nhưng tôi có thể sai. – alex

+0

Vâng, tôi không thấy điều đó. Tôi nghĩ anh ấy gặp rắc rối với các loại thẻ khác nhau. – CodeJoust

2

Không cần sử dụng regex; PHP cung cấp các hàm để loại bỏ các ký tự từ đầu hoặc cuối của một chuỗi. ltrim xóa các ký tự khỏi số bắt đầu của chuỗi, rtrim từ số kết thúc của chuỗi và trim từ cả hai đầu.

$code = trim ($code); 
$code = ltrim($code, '<?php'); 
$code = rtrim($code, '?>'); 

Đầu tiên trim() loại bỏ bất kỳ dấu cách đầu hoặc cuối nào có trong bố cục. Nếu chúng ta bỏ qua điều này và có khoảng trắng bên ngoài của các thẻ PHP trong chuỗi, thì các lệnh ltrimrtrim sẽ không thể xóa các thẻ PHP.

+1

Vấn đề với giải pháp này là '' -tags có thể có mặt nhiều lần trong tệp, không chỉ ở đầu và cuối. Trên thực tế, nếu bạn nhìn vào mẫu của mình, có hai bộ thẻ trong đó. Vì vậy, regex có lẽ là giải pháp khả thi nhất ở đây. –

+0

@ Karl-JohanSjögren Các chức năng tôi đã sử dụng chỉ xóa các thẻ PHP từ đầu hoặc cuối chuỗi; không chỉ ở đâu trong chuỗi. Bạn có thể đọc thêm về các chức năng này tại các liên kết tôi đã bao gồm trong câu trả lời của tôi – shea

+0

Và nếu bạn làm điều đó, ai đó có thể lẻn một bộ thẻ thứ ba ở giữa chuỗi và vẫn làm công cụ xấu, vì vậy điều này thực sự không một đề xuất tốt cho trường hợp người hỏi. –

0

Bạn có thể làm:

eval("?> $string_to_be_evald <?"); 

đó sẽ đóng các thẻ tiềm ẩn và làm cho công việc tất cả mọi thứ.