2017-10-19 57 views
1

所有显示的文本这是我在StackOverflow上的第一篇文章,我希望我会尽我所能,尊重所有的规则:)摘自PHP代码

我有一个包含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“echo”;不开始

2不限内容的内容与报价,与相等数目的开闭括号(如果有的话),以及由点精加工; - 或者 - 引号之间的任何内容(检测到转义字符)

在步骤2上循环4次,直到达到“;”。

我该走向正确的方向吗?你能帮我关于我应该用于第2步的正则表达式吗?

在此先感谢!

[更新]

我成功了使用下面的正则表达式(我知道,它不包括回波函数的每一个可能的用法,但我认为这是够了)来匹配回声内容:

preg_match_all("~echo ([^'\"]*?((?<!\\\\)['\"])((?:(?!\\2).)+?|(?-3))*?\\2[^'\"]*?);~siu", $initialContent, $tMatches, PREG_SET_ORDER); 

既然我有内容,我必须删除任何PHP代码才能保留静态内容。我打算使用的preg_replace删除该内容,但我没有发现任何的正则表达式来实现这一目标?

+1

你可以遇到这么多的边缘情况下这样做,我不会推荐使用正则表达式,而是http://php.net/token_get_all – Calimero

+1

实际上有很多边缘情况,如回声可以与括号'echo('foo');'等等。我们可以知道这个目标是什么吗?这可能是一个XY问题 – Kaddath

+0

总的想法是,我想向翻译者发送我的页面的所有内容。 对于静态HTML内容没有问题,我删除了HTML标签,我能够(从输入字段)返回占位符,我没有问题,与具有使用DB ... 翻译的错误信息等但有时,我认为有一些PHP基本内容(如一个循环来显示一个阵列的不同线)和它可以发生在直接从PHP代码显示文本。 当然,我可以修改我的所有视图,以避免但这需要大量的时间,而正则表达式会更容易:d – Lionel

回答

0

当你有问题,面对和你打算使用解决正则表达式吧,现在你有2个问题:)

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

希望正则表达式可以帮助您提取数据。

+0

哈哈是的,这是真的。正则表达式真的很痛苦写... :( 感谢您的回复,但我正在寻找更详尽的东西。例如,如果您已经转义引号,或者如果您的字符串由单引用并在里面加双引号 关于这部分正则表达式,我目前使用: ((?<!\\)['“])((?:(?!\ 2)。)+?|(? -3))*?\ 2 – Lionel