在使用preg_match_all拆分长字符串时遇到问题

时间:2015-02-23 12:47:04

标签: php regex

我有一个变量(文本),每次有更新时都会用句子更新。当我显示这个数组时,它会变成一个长句,我想用单句来解析它以便于阅读。

<?php
$pattern = '~\\d+-\\d+-\\d{4} // \\w+: ~ ';
$subject = '01-02-2015 // john: info text goes here 10-12-2015 // peter: some more info

';
$matches = array();
$result = preg_match_all ($pattern, $subject, $matches);
?>

这给出了这个输出:

$matches:

array (
  0 => 
  array (
    0 => '01-02-2015 // john: ',
    1 => '10-12-2015 // peter: ',
  ),
)

我希望输出为:

$matches:

array (
  0 => 
  array (
    0 => '01-02-2015 // john: info text goes here',
    1 => '10-12-2015 // peter: some more info',
  ),
)

我需要输出是这样的,所以我可以使用foreach循环来打印每个句子。

PS。我想首先尝试以这种方式工作,因为否则我需要更改数据库中的大量条目。

PPS。我也不是正则表达的英雄,所以我希望有人可以帮助我!

1 个答案:

答案 0 :(得分:2)

只需更改下面的正则表达式,

$pattern = '~\d+-\d+-\d{4} // \w+: .*?(?=\s\d+|$)~';

.*?将执行零个或多个字符的非贪婪匹配,直到达到数字或行尾的空格。

DEMO

$str = "01-02-2015 // john: info text goes here 10-12-2015 // peter: some more info";
preg_match_all('~\d+-\d+-\d{4} // \w+: .*?(?=\s\d+|$)~', $str, $matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => 01-02-2015 // john: info text goes here
            [1] => 10-12-2015 // peter: some more info
        )

)