Для первой части, которая работает из-за .*
.Если вы хотите иметь возможность удалить и вторую часть, вы можете сделать обе группы необязательными, а первую - не жадной.Переместите пробел также во вторую группу.
Обратите внимание, что вам не нужно избегать двойной кавычки и что квантификатор {1}
является лишним, поэтому его можно опустить.
Тамтолько одна двойная кавычка, следующая после первого совпадения, но для предотвращения возможного избыточного совпадения вы можете сделать это совпадение не жадным или использовать вместо него класс отрицательных символов ("[^"]+")
, чтобы избежать ненужного возврата.
(^.*?)?(\[[0-9]+:[0-9]+:[0-9]+:[0-9]+\] )?(".+?") ([0-9]+) ([0-9-]+)
Regex demo
Например
$strings = [
'141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233',
'[29:23:53:25] "GET /Software.html HTTP/1.0" 200 233',
'"GET /Software.html HTTP/1.0" 200 233'
];
$pattern = '/(^.*?)?(\[[0-9]+:[0-9]+:[0-9]+:[0-9]+\] )?(".+?") ([0-9]+) ([0-9-]+)/';
foreach ($strings as $string) {
preg_match($pattern, $string, $matches);
print_r($matches);
}
Результат
Array
(
[0] => 141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233
[1] => 141.243.1.172
[2] => [29:23:53:25]
[3] => "GET /Software.html HTTP/1.0"
[4] => 200
[5] => 233
)
Array
(
[0] => [29:23:53:25] "GET /Software.html HTTP/1.0" 200 233
[1] =>
[2] => [29:23:53:25]
[3] => "GET /Software.html HTTP/1.0"
[4] => 200
[5] => 233
)
Array
(
[0] => "GET /Software.html HTTP/1.0" 200 233
[1] =>
[2] =>
[3] => "GET /Software.html HTTP/1.0"
[4] => 200
[5] => 233
)
Php demo