0

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

这是示例输入:

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

或任何其他可能性

和输出:

<html>
</html>

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

4

2 回答 2

3

我不认为有一种很好的方法可以完全按照您的意愿进行操作,但是如果可以在输出中发送 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];
  }
}
于 2012-07-17T23:46:31.423 回答
2

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

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

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

# 标记表达式开头和结尾的分隔符 - 几乎任何事情都可以(最好是正则表达式本身没有的东西)
<\? 找到文本“<?”,它是 PHP 标记的开头。请注意,问号之前需要一个反斜杠,因为问号通常在正则表达式中做一些特殊的事情。
.*? 包括尽可能多的文本(“.*”),但尽可能少(“?”)。
(\?>|$) 在 PHP 结束标记 ("?>") 或文本结尾 ("$") 处停止。这不一定要停在第一个,但由于前一部分是“尽可能少”,所以它会。
# 相同的分隔符,标记表达式的结束
s 一个特殊的标志,表示模式可以跨越多行。没有它,正则表达式会期望在一行中找到整个 PHP 标记(开始和结束)。
于 2012-07-17T23:52:49.020 回答