PHP preg_match_all /正则表达式问题

时间:2013-02-26 13:52:20

标签: php regex preg-match-all

我有一串文字如下:

2012-02-19-00-00-00+136571235812571+UserABC.log

我需要把它分成三段数据:第一个+(2012-02-19-00-00-00)左边的字符串,两个+(136571235812571)之间的字符串和字符串到+(UserABC.log)的权利。

我现在有这个代码:

preg_match_all('\+(.*?)\+', $text, $match);

我遇到的问题是上面的代码返回:+136571235812571 +

有没有办法使用RegEx给我所有三个数据(没有+标记)或者我需要一个不同的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

这基本上是使用explode()

完成的
explode('+', '2012-02-19-00-00-00+136571235812571+UserABC.log');
// ['2012-02-19-00-00-00', '136571235812571', 'UserABC.log']

您可以使用list()将它们直接分配到变量中:

list($date, $ts, $name) = explode('+', '2012-02-19-00-00-00+136571235812571+UserABC.log');

另请参阅:explode() list()

答案 1 :(得分:1)

使用preg_split()

$str = '2012-02-19-00-00-00+136571235812571+UserABC.log';
$matches = preg_split('/\+/', $str);
print_r($matches);

输出:

Array
(
    [0] => 2012-02-19-00-00-00
    [1] => 136571235812571
    [2] => UserABC.log
)

使用preg_match_all()

$str = '2012-02-19-00-00-00+136571235812571+UserABC.log';
preg_match_all('/[^\+]+/', $str, $matches);
print_r($matches);

答案 2 :(得分:1)

如果您想进行微优化,可以在不使用RegEx的情况下“更快”地完成。显然这取决于您编写代码的上下文。

$string = "2012-02-19-00-00-00+136571235812571+UserABC.log";
$firstPlusPos = strpos($string, "+");
$secondPlusPos = strpos($string, "+", $firstPlusPos + 1);
$part1 = substr($string, 0, $firstPlusPos);
$part2 = substr($string, $firstPlusPos + 1, $secondPlusPos - $firstPlusPos - 1);
$part3 = substr($string, $secondPlusPos + 1);

此代码需要0.003,而我的计算机上的RegEx为0.007,但当然这取决于硬件。