剥去PHP标记preg_replace


Strip PHP tags preg_replace

我想从外部文本中删除所有php标记,这样它就可以安全地包含在php中。

这是示例输入:

<?
?>
<html>
<?php ?>
<?= ?>
</html>
<?

或任何其他可能性

输出:

<html>
</html>

最后一个php打开标记可能没有结束标记!

我不认为有什么好方法可以完全按照您的意愿进行操作,但如果在输出中发送PHP标记(未解析)是可以接受的,您可以使用:

<?php echo file_get_contents('input.html'); ?>

否则,也许可以看看token_get_all方法:

http://www.php.net/manual/en/function.token-get-all.php

您可以迭代所有结果,并且只返回类型为T_INLINE_HTML:的结果

$toks = token_get_all( file_get_contents( 'input.html' ) );
foreach( $toks as $tok ) {
  if( $tok[0] == T_INLINE_HTML )   {
    print $tok[1];
  }
}

正确的方法是不包含它,而是使用file_get_contents()将它作为字符串加载。这将在不执行PHP标记的情况下保留这些标记。但是,下面的正则表达式将完全按照您的要求执行:

#<'?.*?('?>|$)#s

以下是该字符串所代表的内容的分解:

#标记表达式开始和结束的分隔符-几乎任何事情都可以(最好是正则表达式本身中没有的东西)<''?查找文本"<?",它是PHP标记的开头。请注意,问号之前需要一个反斜杠,因为问号通常在正则表达式中起特殊作用。.*?包括尽可能多的文本(".*"),但尽可能少("?")。(''?>|$)在结束的PHP标记("?>")或文本末尾("$")处停止。这不一定要在第一部分停止,但由于前一部分"尽可能少",它会停止的。#相同的分隔符,标记表达式的末尾s一个特殊的标志,表示图案可以跨越多条线。如果没有它,regex将期望在一行中找到整个PHP标记(开始和结束)。