2013-02-26 97 views
1

我有一个文本字符串,看起来像这样:PHP 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+

是否有使用正则表达式来给我的方式所有三个数据(没有+标记)还是我需要一个不同的方法?

谢谢!

回答

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

+0

完美 - 工作出色。谢谢! – Jason 2013-02-26 13:58:44

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); 
1

这是可以做到 “更快”,而无需使用正则表达式,如果你想进入微优化。显然这取决于你正在编写代码的上下文。

$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,相对于0.007的正则表达式我的电脑上,当然这取决于硬件,这将有所不同。

+0

不错的解决方案,但我宁愿去一个简短而干净的代码(爆炸),+1想:) – HamZa 2013-02-28 08:37:02