【问题标题】:Extract all displayed text from php code从 php 代码中提取所有显示的文本
【发布时间】: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

标签: php regex pcre


【解决方案1】:

当你遇到一个问题并打算使用正则表达式解决它时,现在你有两个问题:)

/['"]([^'"]*)['"]/

希望Regex可以帮助你提取数据。

【讨论】:

  • 哈哈是的,这是真的。正则表达式写起来真的很痛苦...... :(感谢您的回复,但我正在寻找更详尽的内容。例如,如果您已转义引号,或者您的字符串以单引号开头并且在里面包含双引号。关于这部分正则表达式,我目前使用: ((?
猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多