2010-07-15 62 views
6

我有了PHP代碼中有一個字符串,我需要從字符串中刪除PHP代碼,例如:如何從一個字符串中刪除PHP代碼?

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

應該返回<p>Dummy</p>

並沒有PHP例如<p>Dummy</p>字符串應該返回相同的字符串。

我知道這可以用正則表達式來完成,但4小時後我還沒有找到一個解決方案。

+0

人提示:你會不會覆蓋支架用正則表達式匹配的所有案件。如果你知道有隻將永遠是一組標籤,或者你有一些其他的約束,一個正則表達式是可能的。Brace匹配是一種非常規語言。 :P – 2010-07-15 18:12:09

+0

您可以提供更多的上下文嗎?可能有一種方法可以實現你正在尋找的東西,而無需使用可變的自存儲php。 – DeaconDesperado 2010-07-15 18:13:02

回答

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))); 
?> 

由於ircmaxell指出:這需要有效的PHP!

一個正則表達式的路線將(在字符串/文件允許沒有與短標籤「PHP」沒有結局>(由於某種原因,Zend公司建議這一點),當然還有一個UNgreedy & DOTALL模式:??

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

請注意,您可能無法從正則表達式解決方案中獲得有效的HTML ......'<?php $ foo ='?>'; $ bar ='something';?>foo'會產生''; $酒吧= '東西'; ?>foo'。它的種類,是沒有完美的解決方案...結合每一個獲得「最好的」... – ircmaxell 2010-07-15 19:10:29

+0

確實,沒有完美的解決方案。如果實際問題能夠得到較高的解決,那麼我們雖然不需要使用這些問題,但它會更好。 – Wrikken 2010-07-15 19:19:05

+0

當你需要準確的東西時,這個解決方案確實做得非常出色。謝謝。 – brenjt 2014-03-19 16:42:16

0

如果您使用的是PHP,你只需要使用正則表達式替換匹配PHP代碼什麼。

下面的語句將刪除PHP標籤:

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

如果沒有找到任何匹配,它不會取代任何東西。

0

好了,你可以使用的DomDocument做...

​​

這兩個功能都將開啓

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

編輯:其實,在看了Wrikken的回答之後,我意識到兩種方法都有缺點......我需要一些有效的HTML標記(Dom很體面,但不會解析<b>foo</b><?php echo $bar)。 Wrikken的要求有效的PHP(任何語法錯誤,它會失敗)。因此,也許一兩個(嘗試一個第一,如果失敗,請嘗試其他的。如果都失敗,有真的不多,你可以不試圖找出他們失敗的確切原因做)......

+0

好的一點,用無效的PHP我的確會失敗。將其添加到解決問題的答案中。 – Wrikken 2010-07-15 19:01:25

0

A的組合簡單的解決方案是爆炸成使用PHP標籤以除去之間的任何內容和內爆回字符串數組。

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; 
} 

這比正則表達式慢,但不需要有效的HTML或PHP;它只需要關閉所有php標籤。

對於並不總是包含最終結束標記和常規錯誤檢查的文件,您可以對標記進行計數,並在結束標記缺失時添加結尾標記(如果打開標記和結束標記未按預期相加則通知)例如在函數的開頭添加下面的代碼。這將慢下來多一點雖然:)

$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)); 
相關問題