2010-07-15 32 views
6

Tôi có một chuỗi có mã php trong nó, tôi cần phải loại bỏ mã php từ chuỗi, ví dụ:Làm thế nào để loại bỏ mã php từ một chuỗi?

<?php $db1 = new ps_DB() ?><p>Dummy</p> 

nên trở <p>Dummy</p>

Và một chuỗi không có php ví dụ <p>Dummy</p> nên trả về cùng một chuỗi.

Tôi biết điều này có thể được thực hiện với cụm từ thông dụng, nhưng sau 4h tôi chưa tìm thấy giải pháp.

+0

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 –

+0

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

Trả lời

8
<?php 
function filter_html_tokens($a){ 
    return is_array($a) && $a[0] == T_INLINE_HTML ? 
     $a[1]: 
     ''; 
} 
$htmlphpstring = '<a>foo</a> something <?php $db1 = new ps_DB() ?><p>Dummy</p>'; 
echo implode('',array_map('filter_html_tokens',token_get_all($htmlphpstring))); 
?> 

Như ircmaxell chỉ ra: điều này sẽ đòi hỏi PHP hợp lệ!

Một tuyến đường regex sẽ được (cho phép không 'php' với thẻ ngắn không có kết thúc> trong chuỗi/file (đối với một số lý do Zend khuyến cáo này) và tất nhiên là một UNgreedy & DOTALL mẫu:.?

preg_replace('/<\\?.*(\\?>|$)/Us', '',$htmlphpstring); 
+0

Chỉ cần lưu ý rằng bạn có thể không nhận được HTML hợp lệ trong giải pháp regex ... ''; $ bar = 'something';?>foo 'sẽ sinh ra ''; $ bar = 'something'; ?>foo '. Các loại của nó, là không có giải pháp hoàn hảo ... Kết hợp mỗi để có được một "tốt nhất" ... – ircmaxell

+0

Thật vậy, không có giải pháp hoàn hảo. Nếu vấn đề thực tế có thể được giải quyết cao hơn để chúng tôi mặc dù lên kludges không phải được sử dụng nó sẽ là thích hợp hơn. – Wrikken

+0

Khi bạn cần một cái gì đó chính xác, giải pháp này thực hiện một công việc tuyệt vời. Cảm ơn bạn. – brenjt

0

Nếu bạn đang sử dụng PHP, bạn chỉ cần sử dụng cụm từ thông dụng để thay thế bất kỳ thứ gì khớp với mã PHP.

Tuyên bố sau đây sẽ loại bỏ các thẻ PHP:

preg_replace('/^<\?php.*\?\>/', '', '<?php $db1 = new ps_DB() ?><p>Dummy</p>'); 

Nếu nó không tìm thấy bất kỳ trận đấu, nó sẽ không thay thế bất cứ điều gì.

0

Vâng, bạn có thể sử dụng DomDocument để làm điều đó ...

function stripPHPFromHTML($html) { 
    $dom = new DomDocument(); 
    $dom->loadHtml($html); 
    removeProcessingInstructions($dom); 
    $simple = simplexml_import_dom($d->getElementsByTagName('body')->item(0)); 
    return $simple->children()->asXml(); 
} 

function removeProcessingInstructions(DomNode &$node) { 
    foreach ($node->childNodes as $child) { 
     if ($child instanceof DOMProcessingInstruction) { 
      $node->removeChild($child); 
     } else { 
      removeProcessingInstructions($child); 
     } 
    } 
} 

hai chức năng sẽ biến

$str = '<?php echo "foo"; ?><b>Bar</b>'; 
$clean = stripPHPFromHTML($str); 
$html = '<b>Bar</b>'; 

Chỉnh sửa: Thực ra, sau khi xem câu trả lời của Wrikken, tôi nhận ra rằng cả hai phương pháp đều có bất lợi ... Mỏ yêu cầu đánh dấu HTML có giá trị (Dom khá, nhưng không phân tích cú pháp <b>foo</b><?php echo $bar). Wrikken's yêu cầu PHP hợp lệ (mọi lỗi cú pháp và nó sẽ thất bại). Vì vậy, có lẽ một sự kết hợp của hai (thử một đầu tiên.Nếu nó không thành công, hãy thử khác. Nếu cả hai thất bại, có thực sự không nhiều bạn có thể làm mà không ... Điện thoại

+0

Điểm tốt, với mọt PHP không hợp lệ thực sự sẽ thất bại. Thêm nó vào câu trả lời cho biện pháp tốt. – Wrikken

0

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)); 
Các vấn đề liên quan