3

我正在尝试从一个长文件中提取 php 代码。我希望丢弃不在 PHP 标签中的代码。例子

<html>hello world, its a wonderful day</html>
<?php echo $user_name; ?> Some more text or HTML <?php echo $datetime; ?> 
I just echoed the user_name and datetime variables.

我想返回一个数组:

array(
    [1] =>  "<?php echo $user_name; ?>"
    [2] =>  "<?php echo $datetime; ?>"
)

我想我可以用正则表达式做到这一点,但我不是专家。有什么帮助吗?我用 PHP 写这个。:)

4

1 回答 1

7

您必须查看源代码才能看到结果,但这是我想出的:

$string = '<html>hello world, its a wonderful day</html>
<?php echo $user_name; ?> Some more text or HTML <?php echo $datetime; ?> 
I just echoed the user_name and datetime variables.';

preg_match_all("/<\?php(.*?)\?>/",$string,$matches);

print_r($matches[0]); // for php tags
print_r($matches[1]); // for no php tags

更新:正如Revent 所述,您可以使用<?=速记 echo 语句。可以更改您的内容preg_match_all以包括以下内容:

$string = '<html>hello world, its a wonderful day</html>
<?php echo $user_name; ?> Some more text or HTML <?= $datetime; ?> 
I just echoed the user_name and datetime variables.';

preg_match_all("/<\?(php|=)(.*?)\?>/",$string,$matches);

print_r($matches[0]); // for php tags
print_r($matches[1]); // for no php tags

另一种选择是检查<?(space) 的速记 php 语句。您可以包含一个空格 ( \s) 来检查这一点:

preg_match_all("/<\?+(php|=|\s)(.*?)\?>/",$string,$matches);

我想这取决于你想要的“严格”程度。

Update2: MikeM确实提出了一个很好的观点,即注意换行符。您可能会遇到标签运行到下一行的实例:

<?php 
echo $user_name; 
?>

这可以通过使用s修饰符来轻松解决skip linbreaks

preg_match_all("/<\?+(php|=|\s)(.*?)\?>/s",$string,$matches);
于 2013-04-04T21:18:47.140 回答