PHP - 从字符串中删除 <?php ?> 标签

5

如何最好地从字符串中删除这些标签,以便准备将其传递给eval()?

例如,字符串可以是这样的:

<?php
  echo 'hello world';
  ?>
  Hello Again
  <?php

  echo 'Bye';
?>

显然,str_replace无法起作用,因为中间的两个php标签必须存在(第一个和最后一个需要被删除)


1
你为什么想要这样做?这听起来像是一个糟糕的主意。 - alex
1
答案是不要使用 eval。;)(实际上只有25%的玩笑成分。) - deceze
3
我曾经使用过eval,结果导致小狗死了,这是真实的故事。 - delete me
2
eval() 是有害的...因为你不知道它是否清除了它使用的变量;访问文件系统、网络等内容;对会话或cookie 进行操作;或者杀死幼犬。很危险。 - CaseySoftware
@CaseySoftware 那最后一个让我笑了。 - alex
显示剩余5条评论
4个回答

5
通常情况下,您不会想将函数传递给eval。如果您只想删除标记,则使用string_replace即可完成工作,但最好使用正则表达式。 preg_replace(array('/<(\?|\%)\=?(php)?/','/(\%|\?)>/),array('',''),$str);
这包括旧的asp标记、php短标记、php echo标记和普通php标记。

我认为他只想要移除开头和结尾的字符,但我可能错了。 - alex
是的,我没看到那个。我以为他有问题是因为不同类型的标签。 - CodeJoust

4
听起来不太好,但是如果您想删除开头和结尾的部分,可以这样做:
$removedPhpWrap = preg_replace('/^<\?php(.*)(\?>)?$/s', '$1', $phpCode);

这样做应该可以解决问题(未经测试)。

请告诉我你为什么想要这样做,我有95%的把握会有更好的方法。


1
没有最后的'?>'的PHP怎么样? :P - MysteryDev
1
在使用上述解决方案之前,请在此处阅读答案:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - brenjt
1
@brenjt 所以用正则表达式解析HTML并匹配PHP的开闭标签是一回事?今天我学到了。 - alex

3
你可以这样做:
eval("?> $string_to_be_evald <?");

这将会关闭隐式标签并使所有内容正常工作。


1

不需要使用正则表达式;PHP提供了用于从字符串开头或结尾删除字符的函数。ltrim 从字符串开头删除字符,rtrim 从字符串结尾删除字符,trim 从两端删除。

$code = trim ( $code );
$code = ltrim( $code, '<?php' );
$code = rtrim( $code, '?>' );

trim() 是首先执行的函数,它会去除字符串开头和结尾的空格。如果我们省略这个函数,而字符串中 PHP 标签之外有空格存在,则 ltrimrtrim 命令将无法去除 PHP 标签。


2
这种解决方案的问题是文件中可能出现多个 <? ?> 标签,而不仅仅是在开头和结尾。实际上,如果你看他的示例,里面有两组标签。因此,正则表达式可能是最可行的解决方案。 - Karl-Johan Sjögren
如果你这样做,有人可以在字符串中间悄悄地插入第三组标签并仍然做坏事,所以这对于提问者的情况并不是一个好的建议。 - Karl-Johan Sjögren
此外,如果字符串在闭合的 ?> 标签后有换行符,或者在第一个 <?php 标签前有前导空格(或任何其他围绕这些标签的空格),则此处建议使用的正则表达式方法将无法工作。 - shea
@alex 我知道 trim() 是这样工作的,但是 ltrim()rtrim() 也是一样吗? - shea
就文档而言。 - alex
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接