我有了PHP代碼中有一個字符串,我需要從字符串中刪除PHP代碼,例如:如何從一個字符串中刪除PHP代碼?
<?php $db1 = new ps_DB() ?><p>Dummy</p>
應該返回<p>Dummy</p>
並沒有PHP例如<p>Dummy</p>
字符串應該返回相同的字符串。
我知道這可以用正則表達式來完成,但4小時後我還沒有找到一個解決方案。
我有了PHP代碼中有一個字符串,我需要從字符串中刪除PHP代碼,例如:如何從一個字符串中刪除PHP代碼?
<?php $db1 = new ps_DB() ?><p>Dummy</p>
應該返回<p>Dummy</p>
並沒有PHP例如<p>Dummy</p>
字符串應該返回相同的字符串。
我知道這可以用正則表達式來完成,但4小時後我還沒有找到一個解決方案。
<?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);
請注意,您可能無法從正則表達式解決方案中獲得有效的HTML ......'<?php $ foo ='?>'; $ bar ='something';?>foo'會產生''; $酒吧= '東西'; ?>foo'。它的種類,是沒有完美的解決方案...結合每一個獲得「最好的」... – ircmaxell 2010-07-15 19:10:29
確實,沒有完美的解決方案。如果實際問題能夠得到較高的解決,那麼我們雖然不需要使用這些問題,但它會更好。 – Wrikken 2010-07-15 19:19:05
當你需要準確的東西時,這個解決方案確實做得非常出色。謝謝。 – brenjt 2014-03-19 16:42:16
如果您使用的是PHP,你只需要使用正則表達式替換匹配PHP代碼什麼。
下面的語句將刪除PHP標籤:
preg_replace('/^<\?php.*\?\>/', '', '<?php $db1 = new ps_DB() ?><p>Dummy</p>');
如果沒有找到任何匹配,它不會取代任何東西。
好了,你可以使用的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(任何語法錯誤,它會失敗)。因此,也許一兩個(嘗試一個第一,如果失敗,請嘗試其他的。如果都失敗,有真的不多,你可以不試圖找出他們失敗的確切原因做)......
好的一點,用無效的PHP我的確會失敗。將其添加到解決問題的答案中。 – Wrikken 2010-07-15 19:01:25
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));
人提示:你會不會覆蓋支架用正則表達式匹配 .... ?>的所有案件。如果你知道有隻將永遠是一組標籤,或者你有一些其他的約束,一個正則表達式是可能的。Brace匹配是一種非常規語言。 :P – 2010-07-15 18:12:09
您可以提供更多的上下文嗎?可能有一種方法可以實現你正在尋找的東西,而無需使用可變的自存儲php。 – DeaconDesperado 2010-07-15 18:13:02