1

我有一串如下所示的文本:

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 给我所有三个数据(没有 + 标记),还是我需要不同的方法?

谢谢!

4

3 回答 3

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()

于 2013-02-26T13:54:10.100 回答
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);
于 2013-02-26T13:57:02.207 回答
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,但当然这会因硬件而异。

于 2013-02-26T14:31:53.563 回答