2013-02-26 6 views
1

У меня есть строка текста, которая выглядит следующим образом:PHP preg_match_all/Regular Expression Issue

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

В основном это делается с 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

PERFECT - отлично работал. СПАСИБО! – Jason

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 для RegEx на моем компьютере, но это, конечно, будет меняться в зависимости от аппаратного обеспечения.

+0

Хорошее решение, но я скорее пойду с коротким и чистым кодом (взорваться), +1 думал :) – HamZa