1

我正在尝试通过查找 PHP 标记来拆分带有换行符的字符串。

这是我到目前为止的代码:

$contents = '
some test
some more test
test 1
<?php 
test 2 and test 4
test 6
?>
test 7
test 9
<?php 
test 10
test 12
>?
test 13
<?php test 14
test 16 
?>
test 17
';

如您所知,PHP 代码是 EVEN 测试示例,ODD 测试示例位于 PHP 标记之外。

我要做的是在每次迭代 php 代码时提取到一个数组中:

预期结果:

array(
    [0] =>  <?php 
            test 2 and test 4
            test 6
            ?>

    [1] =>  <?php 
            test 10
            test 12
            >?

    [2] =>  <?php test 14
            test 16 
            ?>
)

我试过用preg_split结束标签,然后用$explode[1]开始标签捕获,但我的代码是错误的......

$ends = preg_split("/[?>]/s", $contents, PREG_SPLIT_NO_EMPTY, PREG_SPLIT_DELIM_CAPTURE );
print_r($ends);
foreach($ends as $flufcode){
  $trimcode = explode('<?php', $flufcode);
  echo $trimcode . " next:";
}

到目前为止我的preg_split不起作用,我相信我的正则表达式在换行后没有扫描。

4

3 回答 3

1

您的示例代码是错误的。和错误的预期结果......无论如何。并且使用正则表达式解析代码<?php echo '?>'; ?>将失败。

为了正确和轻松地解析,您应该使用token_get_all。给你的例子。

$tokens = token_get_all($contents);

$catch = false;
$codes = array();
$index = 0;
foreach ($tokens as $token)
    {
    if (is_array($token) && $token[0] == \T_OPEN_TAG)
        {
        $catch = true;
        $index++;
        $codes[$index] = '';
        }
    if ($catch)
        $codes[$index] .= is_array($token) ? $token[1] : $token;

    if (is_array($token) && $token[0] == \T_CLOSE_TAG)
        {
        $catch = false;
        }
    }

var_export($codes);

将使用您提供的数据生成。

array (
  1 => '<?php
test 2 and test 4
test 6
?>
',
  2 => '<?php
test 10
test 12
>?
test 13
<?php test 14
test 16
?>
',
)
于 2013-04-05T01:21:03.277 回答
0

问号是一个正则表达式元字符——尝试转义它:

$ends = preg_split("/\\?>/sm", $contents, PREG_SPLIT_NO_EMPTY, PREG_SPLIT_DELIM_CAPTURE );
于 2013-04-05T01:11:33.827 回答
0

我会用

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

<?php这会不情愿地(而?>不是贪婪地)捕获所有内容。请注意,$matches数组将被嵌套。

于 2013-04-05T01:17:17.150 回答