我想从外部文本中删除所有 php 标签,以便它可以安全地包含在 php 中。
这是示例输入:
<?
?>
<html>
<?php ?>
<?= ?>
</html>
<?
或任何其他可能性
和输出:
<html>
</html>
最后一个 php 打开标签可能没有结束标签!
我想从外部文本中删除所有 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 一个特殊的标志,表示模式可以跨越多行。没有它,正则表达式会期望在一行中找到整个 PHP 标记(开始和结束)。