A giải pháp đơn giản là phát nổ thành các mảng bằng cách sử dụng các thẻ php để loại bỏ bất kỳ nội dung nào giữa và mã hóa trở lại một chuỗi.
function strip_php($str) {
$newstr = '';
//split on opening tag
$parts = explode('<?',$str);
if(!empty($parts)) {
foreach($parts as $part) {
//split on closing tag
$partlings = explode('?>',$part);
if(!empty($partlings)) {
//remove content before closing tag
$partlings[0] = '';
}
//append to string
$newstr .= implode('',$partlings);
}
}
return $newstr;
}
Điều này chậm hơn regex nhưng không yêu cầu html hoặc php hợp lệ; nó chỉ yêu cầu tất cả các thẻ php phải được đóng lại.
Đối với các tệp không luôn bao gồm thẻ đóng cuối cùng và kiểm tra lỗi chung, bạn có thể đếm thẻ và gắn thẻ đóng nếu thẻ bị thiếu hoặc thông báo nếu thẻ mở và đóng không thêm như mong đợi, ví dụ thêm mã bên dưới vào đầu hàm. Điều này sẽ làm chậm nó xuống một chút mặc dù :)
$tag_diff = (substr_count($str,'<?') - (substr_count($str,'?>');
//Append if there's one less closing tag
if($tag_diff == 1) $str .= '?>';
//Parse error if the tags don't add up
if($tag_diff < 0 || $tag_diff > 1) die('Error: Tag mismatch.
(Opening minus closing tags = '.$tag_diff.')<br><br>
Dumping content:<br><hr><br>'.htmlentities($str));
Mẹo: bạn sẽ không bao gồm tất cả các trường hợp khớp với khung .... ?> với cụm từ thông dụng. Nếu bạn biết rằng sẽ chỉ bao giờ có một bộ thẻ, hoặc bạn có một số ràng buộc khác, một regex có thể là có thể.Brace phù hợp là một ngôn ngữ không thường xuyên. : P –
Bạn có thể cung cấp thêm ngữ cảnh không? Có thể có một cách để đạt được những gì bạn đang tìm kiếm mà không cần phải sử dụng một biến tự lưu trữ php. – DeaconDesperado