【发布时间】:2018-03-31 08:15:02
【问题描述】:
这是我在 StackOverflow 上的第一篇文章,我希望我会尽我所能遵守所有规则:)
我有一个包含 PHP 代码的文件。我正在尝试读取文件并仅提取通过回显行显示的文本,而不提取动态内容。
这是我用于测试目的的 PHP 代码示例:
some HTML data
<?php
echo 'OK';
echo 'OK'.$ko;
echo $ko.'OK';
echo $ko.'OK'.$ko.'OK'.$ko;
echo 'OK'.$ko.'OK'.$ko;
echo 'OK'.(($data=='toto') ? 'OK' : 'OK2').'OK';
echo someFunction().'OK';
?>
some HTML data
我可以通过以下正则表达式从其余内容中提取 PHP 代码:
preg_match_all("~<\\?php(.*?)\\?>~siu", $initialContent, $tMatches, PREG_SET_ORDER);
但我没有成功找到如何从回显行中删除 PHP 代码,只保留静态内容。 我要检测的是:
1 “回声”这个词;
2 任何不以引号开头、具有相等数量的左括号和右括号(如果有)并以点结尾的任何内容; - 或 - 引号之间的任何内容(检测转义字符)
4 在第 2 步上循环,直到我到达“;”。
我的方向正确吗?您能否帮助我了解我应该在第 2 步中使用的正则表达式?
提前致谢!
[更新]
我使用以下正则表达式成功匹配了 echo 内容(我知道它并没有涵盖 echo 函数的所有可能用法,但我认为现在已经足够了):
preg_match_all("~echo ([^'\"]*?((?<!\\\\)['\"])((?:(?!\\2).)+?|(?-3))*?\\2[^'\"]*?);~siu", $initialContent, $tMatches, PREG_SET_ORDER);
现在我有了内容,我必须删除所有 PHP 代码才能只保留静态内容。我打算用preg_replace来删除这个内容,但是我没有找到任何正则表达式来达到这个目的……
【问题讨论】:
-
这样做可能会遇到很多边缘情况,我不建议使用正则表达式,而是使用php.net/token_get_all
-
实际上有很多边缘情况,例如 echo 可以与括号
echo('foo');等一起使用。我们能知道这样做的目标是什么吗?可能是 XY 问题 -
总的想法是我想将我页面的所有内容发送给翻译。对于静态 HTML 内容没问题,我删除了 HTML 标签,我能够返回占位符(从输入字段),我对使用 DB 进行翻译的错误消息等没有问题......但有时,我的观点有一些 PHP 的基本内容(比如显示数组不同行的循环),并且它可以碰巧直接从 PHP 代码显示文本。当然,我可以修改我所有的观点来避免这种情况,但这需要很长时间,而且正则表达式会更容易:D