多行PHP正则表达式问题

时间:2011-05-10 07:49:00

标签: php regex multiline

我已经尝试过在这里和谷歌...但我无法弄清楚我做错了什么:(

我有这样的文字:

C 1 title
comment 1

C 2 title2
comment 2

C 3 title3
comment 3

现在......我想做的是

  1. 检查开始时的C.
  2. 捕获数字
  3. 捕捉瓷砖
  4. 捕获评论
  5. 我正在尝试使用这个表达式:

    preg_match_all("/^C (\d*) (.*)\n(.*)$/im", $body, $match);
    

    但它仅适用于第一组=(

    关于我做错什么的任何提示???

    感谢!!!!

1 个答案:

答案 0 :(得分:5)

它按预期工作。

摘录:

<?php
$body = 'C 1 title
comment 1

C 2 title2
comment 2

C 3 title3
comment 3';

preg_match_all("/^C (\d*) (.*)\n(.*)$/im", $body, $match);

print_r($match);
?>

产生以下输出:

Array
(
    [0] => Array
        (
            [0] => C 1 title
comment 1
            [1] => C 2 title2
comment 2
            [2] => C 3 title3
comment 3
        )

    [1] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            )

    [2] => Array
        (
            [0] => title
            [1] => title2
            [2] => title3
        )

    [3] => Array
        (
            [0] => comment 1
            [1] => comment 2
            [2] => comment 3
        )

)
正如您在Ideone上看到的那样

为了让您的匹配保持良好分组,您可能需要尝试:

preg_match_all("/^C (\d*) (.*)\n(.*)$/im", $body, $match, PREG_SET_ORDER);

代替。

HTH

修改

Ideone运行:PHP Version => 5.2.12-pl0-gentoo

我还在我的机器上测试了它(得到相同的结果),运行:PHP Version => 5.3.3-1ubuntu9.5

但我无法想象这是一个版本化的东西(至少,不是5.x版本)。也许你的换行符是Windows风格?试试这个正则表达式:

"/^C +(\d*) +(.*)\r?\n(.*)$/im"

我使用换行符\r?\n而不仅仅是\n,以便匹配Windows和Unix风格的换行符,并用+替换单个空格以考虑可能的两个换行符(或更多)空间。