通过php的分隔符本身拆分一个字符串

时间:2013-04-04 21:10:17

标签: php regex string

我正在尝试从长文件中提取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写这个。 :)

1 个答案:

答案 0 :(得分: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所述,您可以使用<?=来获取简写回复状态。您可以更改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

另一种方法是检查简写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);