【问题标题】:PHP - Removing <?php ?> tags from a stringPHP - 从字符串中删除 <?php ?> 标记
【发布时间】:2010-07-01 01:55:43
【问题描述】:

从字符串中删除这些标签以准备将其传递给 eval() 的最佳方法是什么?

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

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

  echo 'Bye';
?>

显然 str_replace 不起作用,因为中间的两个 php 标签需要在那里(第一个和最后一个需要删除)

【问题讨论】:

  • 为什么要这样做?闻起来是个坏主意。
  • 答案是你不要使用eval。 ;)(实际上只有 25% 的人在开玩笑。)
  • 我用了一次eval,小狗死了,真实的故事。
  • 相信我,这是出于非常正当的理由 :)
  • eval() 是邪恶的。它可能导致各种漏洞,因为您不知道它是否正在清理它使用的变量;访问文件系统、网络等上的东西;使用会话或 cookie 做事;或杀死小狗。不好。

标签: php string tags eval


【解决方案1】:

通常,您不希望将函数传递给 eval。 如果您只想删除标签,string_replace 可以很好地完成这项工作,但是您最好使用正则表达式。

preg_replace(array('/&lt;(\?|\%)\=?(php)?/', '/(\%|\?)&gt;/'), array('',''), $str);

这包括旧的 asp 标签、php 短标签、php echo 标签和普通 php 标签。

【讨论】:

  • 我认为他只想删除开头和结尾,但我可能错了。
  • 是的,我没看到。我以为他在处理不同类型的标签时遇到了麻烦。
【解决方案2】:

听起来是个坏主意,但如果你想删除开头和结尾的部分,你可以这样做

$removedPhpWrap = preg_replace('/^<\?php(.*)(\?>)?$/s', '$1', $phpCode);

这个应该做(未测试)。

请告诉我你为什么要这样做,我 95% 确定有更好的方法。

【讨论】:

  • 没有最后一个 '?>' 的 php 怎么办? :P
  • 在使用上述解决方案之前,请在此处阅读此答案:stackoverflow.com/a/1732454/589909
  • @brenjt 所以 解析 HTML 与正则表达式和匹配 PHP 开始和结束标签是一回事吗?直到。
【解决方案3】:

你可以这样做:

eval("?> $string_to_be_evald <?");

这将关闭隐式标签并使一切正常。

【讨论】:

    【解决方案4】:

    不需要使用正则表达式; PHP 提供了从字符串的开头或结尾删除字符的函数。 @987654321@ 从字符串的开头 删除字符,@987654322@ 从字符串的end 删除,@987654323@ 从两端删除。

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

    第一个trim() 会删除站点中存在的任何前导或尾随空格。如果我们省略了这一点并且字符串中 PHP 标记的 outside 有空格,那么 ltrimrtrim 命令将无法删除 PHP 标记。

    【讨论】:

    • 这个解决方案的问题是&lt;? ?&gt;-tags 可以在文件中出现多次,而不仅仅是在开头和结尾。实际上,如果你看他的样本,里面有两组标签。所以正则表达式可能是这里最可行的解决方案。
    • @Karl-JohanSjögren 我使用的函数只从字符串的开头或结尾删除 PHP 标记;不仅仅是字符串中的任何地方。您可以在我的答案中包含的链接中阅读有关这些功能的更多信息
    • 如果你这样做,有人可以在字符串中间偷偷第三组标签,但仍然会做坏事,所以这对于提问者的情况来说确实不是一个好的建议。跨度>
    • 嗯?如果您阅读 OP 的 cmets,他说 只有管理员 可以编辑传递给 eval() 的内容。无论如何,第三组标签到底有多糟糕?
    • 另外,如果字符串在结束 ?&gt; 标记之后有换行符,或者在第一个 &lt;?php 标记(或任何其他这些标签周围的空格)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多